您的位置:首页 > 编程语言 > C语言/C++

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

2014-02-19 15:58 465 查看
题目链接: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截图:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息