【二分查找】-HDU-1969-Pie

来源:互联网 发布:spss for mac 23 编辑:程序博客网 时间:2024/05/01 15:16

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1969

题目描述:

这位富二代过生日请小伙伴们吃pie,要求把pie平均分成(F+1)块(加上自己),每份必须是一整块,不能是若干块拼起来的。问一份最大体积是多少。

解题思路:

虽说这题很水,但第二次做二分。。没什么经验,还是琢磨了一阵,,然后就是通过不断判定 left right 变量是否成立二分找答案。难度不大,详见代码。

之后一直WA。没办法,上网查了别人代码。The answer should be given as a floating point number with an absolute error of at most 10^(-3).

 这句话的意思竟然是printf %.4lf !我日你大爷。好吧,改完AC了。

教训:以后圆周率统统写成 acos( -1.0 )。这题精度设到1e-7。注意不要精度不够,不要超时。还有不要写cout了!!用 printf!

AC代码:
#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <cmath>#define PI acos(-1.0)#define eps 1e-7using namespace std;double N,F;double v[10050],tv[10050];int ok(double x){    if(!x)return 1;    memset(tv,0,sizeof(tv));    for(int i=0; i<N; i++)    {        tv[i]=v[i];    }    int i,num=0,flag=0;    for(i=0; i<=N; i++)    {        if(num>=F+1)        {            flag=1;            break;        }        if(tv[i]>=x)        {            while(tv[i]>=x)            {                tv[i]-=x;                num++;            }        }    }    if(flag)return 1;    return 0;}int main(){    int T,r,i;    double sum;    cin>>T;    while(T--)    {        cin>>N>>F;        memset(v,0,sizeof(v));        sum=0;        for(i=0; i<N; i++)        {            cin>>r;            v[i]=r*r;            sum+=v[i];        }double left,right;        left=0;        right=sum/(F+1);        while(right-left>eps)        {            double mid=(left+right)/2.0;            if(ok(mid))                left=mid;            else                right=mid;        }        printf("%.4lf\n",left*PI);    }    return 0;}
AC截图:


0 0
原创粉丝点击