您的位置:首页 > 其它

(二分)HDU 1969 pie

2016-07-27 12:15 337 查看
简单的二分题,注意精度

不知道为什么老是WA

WA代码:

#include <stdio.h>
#include <math.h>
double pi = acos(-1.0);
#define eps 1e-7
int main()
{
int k,n,f,i,r,count;
double mid,a[10005],low,up;
scanf("%d",&k);
while(k--)
{
low=0.0;
up=0.0;
scanf("%d%d",&n,&f);
f+=1;
for(i=0;i<n;i++)
{
scanf("%d",&r);
a[i]=Pi*r*r;
if(a[i]>up)
up=a[i];
}
mid=(up+low)/2;
while(up-low>eps)
{
count=0;
for(i=0;i<n;i++)
count+=(int)(a[i]/mid);
if(count>=f)
low=mid;
else
up=mid;
mid=(up+low)/2;
}
printf("%.4lf\n",mid);
}
return 0;
}

下面是AC代码

#include <stdio.h>
#include <math.h>
double pi = acos(-1.0);
int F,N,i;
double V[10001];
int test(double x)
{
int num=0;
for(i = 0; i < N;i++)
{
num += (int)(V[i]/x);
}
if(num>=F)
return 1;
else return 0;
}
int main()
{
int t,r;
double v,max,left,right,mid;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&N,&F);
F = F+1;
for(i = 0; i < N; i++)
{
scanf("%d",&r);
V[i] = pi*r*r;
v += V[i];
}
max = v/F;
left = 0.0;
right = max;
while((right-left)>1e-6)//注意这里的精度问题。
{
mid = (left+right)/2;
if(test(mid))
left = mid;
else right = mid;
}
printf("%.4f\n",mid);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: