您的位置:首页 > 其它

BestCoder55 hdu5432 二分

2015-09-12 22:42 435 查看
枚举高度时要二分,否则超时,当l和r的整数相同就可以终止了。需要特别注意切面可以在某些金字塔上面,因为这WA了好多次。

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<string>
#include<map>
#include<set>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<sstream>
#define LL long long
#define OJ_DEBUG 0
#define READ_FILE 1
using namespace std;
const int NN_MAX = 10010;
const int MM_MAX = NN_MAX*NN_MAX;
const int INF = 0x3f3f3f3f;
/**********************************************************/
double a[NN_MAX],b[NN_MAX];
/**********************************************************/

/**********************************************************/
int main()
{
if(READ_FILE) freopen("in.txt","r",stdin);
int tt,n;
scanf("%d",&tt);
while(tt--)
{
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%lf",&b[i]);
for(int i=0;i<n;i++) scanf("%lf",&a[i]);
double s1=0;
for(int i=0;i<n;i++)
s1 += a[i]*a[i]*b[i];
s1/=2.0;
double l=0,r=1000.0,mid;
while(l<=r)
{
mid = (l+r)/2;
if( (int)l == (int)r ) break;
double s2=0;
for(int i=0;i<n;i++)
if(b[i]>mid)
s2 += pow(a[i],2)*pow(b[i]-mid,3)/pow(b[i],2);
if(s2 > s1)
l=mid;
else if(s2 < s1)
r=mid;
else if(s2 == s1)
break;
}
printf("%d\n",(int)mid);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  BestCoder hdu 二分