题目大意:有F+1个人来分N个圆形派,每个人得到的必须是一整块派,而不是几块拼在一起,且面积要相同。求出每个人最多能得到多大面积的派(不必是圆形)
其实就是分吃的^ ^,要均分.
二分查找的应用。
找一个派最大的面积maxa,那么能得到的就是在0~maxa。
然后不断的取中间的面积mid进行判断是否满足要求就可以了。
怎么判断呢?
看它是否满足每个派分成面积为mid的小派是否能满足F+1个人。(这句有点绕口令的感觉T T吐槽:干嘛叫派啊。我还蛋黄派呢,好吧,看不懂的把它替换为蛋黄派^ ^)
每个蛋黄派最多能分成 π*r*r/mid个。
就是这样啦~
值得注意的是π的精度。
3.141592654被秒杀。但PI=3.1415926535898;就过了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const double PI=3.1415926535898;//书上是 PI=acos(-1.0);受教了
const int MAXN=10000+10;
double area[MAXN];
int main()
{
int T,n,f,r;
scanf("%d",&T);
while(T--)
{
double maxa=0;
scanf("%d%d",&n,&f);
for(int i=0;i<n;i++)
{
scanf("%d",&r);
area[i]=r*r*PI;
maxa=max(maxa,area[i]);
}
double mid=maxa/2,upper=maxa,lower=0,ans=mid;
while(upper-lower>1e-5)
{
int sum=0;
for(int i=0;i<n;i++)
sum+=floor(area[i]/mid);//也可以直接sum+=area[i]/mid; 但是看编译器警告好不爽T T
if(sum>=f+1)
{ lower=mid; ans=mid; }
else
upper=mid;
mid=(upper+lower)/2;
}
printf("%.4lf\n",ans);
}
}