题目大意:F+1个人分N个派,要求每个人所得的派的面积都相同,每个人获得的派必须是整个,不能是多个拼接在一起(即可以任意切割某一个派,获得面积相等的若干个派,多余部分弃掉),求每人得到的派的面积的最大值。
二分答案x,用每个派的面积去除x,得到该派能够分给的人数。累加起来判断是否能否分给至少F+1个人。
#include<bits/stdc++.h>
using namespace std;
typedef double db;
#define pi acos(-1.0)
db A[10005];
int f,n;
bool check(db x){
int s=0;
for(int i=1;i<=n;++i) s+=floor(A[i]/x);
return s>=f+1;
}
int main()
{
int t,i;
cin>>t;
while(t--)
{
scanf("%d%d",&n,&f);
db L=0,R=-1,r;
for(i=1;i<=n;++i){
scanf("%lf",&r);
A[i]=r*r*pi;
R=max(R,A[i]);
}
while(R-L>1e-5){
db m=(L+R)/2;
if(check(m)) L=m;
else R=m;
}
printf("%.4lf\n",R);
}
return 0;
}