(二分)HDU 1969 pie

来源:互联网 发布:从笔记本cpu编号知型号 编辑:程序博客网 时间:2024/05/16 02:02

简单的二分题,注意精度

不知道为什么老是WA

WA代码:

#include <stdio.h>#include <math.h>double pi = acos(-1.0);#define eps 1e-7int 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;}


0 0