题目大意:就是给出n个馅饼,f个party朋友,问分给每个人多少面积的馅饼,才使得f+1(包括party主人----我)个人得到的馅饼面积最大。分割的规则是:每个人得到的馅饼仅来自一个馅饼。这也就是说不是一般的总和再平均的问题。
思路:呜呜~~小增的第一道统计二分啊~~惭愧~~本题二分的上限是最大的馅饼的半径的平方(我是用馅饼的半径的平方处理的)。还是说一下为什么用二分吧,因为分馅饼是一个实数问题,如果用二分来枚举,速度还不错。。
AC program:
#include<iostream>
#include<iomanip>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int test,n,f,pp;
double mm[10005];
double low,high,mid;
double pi=acos(-1.0);
int main()
{
scanf("%d",&test);
while(test--)
{
scanf("%d%d",&n,&f);
pp=f+1;
low=0;
high=-1;
double tmp;
for(int i=0;i<n;i++)
{
scanf("%lf",&tmp);
mm[i]=tmp*tmp;///
if(mm[i]-high>0.0000001)
high=mm[i];
}
while(high-low>0.0000001)
{
mid=(low+high)/2;
int cnt=0;
for(int i=0;i<n;i++)
{
if(mm[i]-mid>0.0000001)//这个小数不要太小,太小就超时了,我勒个去
{
cnt+=(int)(mm[i]/mid);
}
}
if(cnt<pp)
high=mid;
else
low=mid; //如果一时没想起相等和谁一起,那就先顺着大大小小来先。。
}
printf("%.4lf\n",pi*mid);
//cout<<fixed<<setprecision(4)<<mid*pi<<endl;
}
//system("pause");
return 0;}
小优的博客解释的很清楚:http://blog.csdn.net/lyy289065406/article/details/6648565