http://acm.hdu.edu.cn/showproblem.php?pid=1969
题意:主人家里来了F个朋友,要求把N个Pie分成大小相同的F+1份,要求每份尽可能大。
思路:看到题目输出要求的精度,就自然的想到了二分法。要注意是有F个朋友,共分成F+1份。
然后二分的最右值直接取最大的那个Pie 就可以了。
问题:这个题目之前就做过了一遍,直接A了。近期做的时候连着WA了很多次,后来终于找到了原因,就是我在取右值的时候没有记录max的值,而是记录它们的总和,然后除以(F+1),关键的错误点是我声明的sum是int,要是极端的情况情况是1万亿,这样就会超出int范围。后来换成了long long或double 都没问题,都可以A了。后来又看到其实还有一种更好的方法是求最大的那个Pie的体积值。
#include<iostream>
#include<cstdio>
#include<math.h>
#define pi acos(-1.0)
using namespace std;
int main()
{
int t;
cin>>t;
int a[11000];
while(t--)
{
int n,f;
int max=0;
cin>>n>>f;
for(int i=0;i<n;i++)
{
int temp;
scanf("%d",&temp);
a[i]=temp*temp;
if(a[i]>max)
max=a[i];
}
double r=max; //这个最右值就是最大一个。
double l=1e-6;
double mid;
while(r-l>1e-6) //这样可以控制精度。
{
mid=(r+l)/2;
int ans=0;
for(int i=0;i<n;i++)
{
ans+=a[i]/mid;
}
if(ans>=f+1)
l=mid+1e-6; //分成的份数大于或是等于f+1,都应该取更大的值(注意要有等于)。
else
r=mid-1e-6;
}
printf("%.4f\n",mid*pi);
}
return 0;
}