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

题目链接: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-7
using 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值