题意是:某人在生日的时候请朋友一起吃pie,但是他的朋友十分挑剔,
如果有人分到了一块比其他人大的pie,那么其他的朋友就会抱怨,因此每个人,
包括主人,都必须分到大小一样的pie,但是每个人的pie只能是从一块大的圆形pie中切出来的,
要求求出每人能分到的最大的pie,给定圆形pie的数量 n,朋友数量m,以及每个pie的半径r 利用二分上界就是其中体积最大的那个pie,下界为0,求出mid看看以此大小可以分给多少人,如果小于m则是mid大了,high=mid,如果人数》=m则满足要求,求出最大的的即可。
代码:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
const double PI=acos(-1.0);
const intN=10010;
double s[N];
int r[N];
int main()
{
int T,i;
int n,f;
while(scanf("%d",&T)!=EOF)
{
while(T--)
{
scanf("%d%d",&n,&f);
f++;
for(i=0;i<n;i++)
scanf("%d",&r[i]);
sort(r,r+n);
for(i=0;i<n;i++)
{
s[i]=(double(r[i]*r[i]));
}
double low=0,high=s[n-1];
double num=0;
while(high-low>1e-6)
{
double mid=(low+high)/2;
double tf=f;
int i=n-1;
while(i>=0&&tf>0)
{
int m=(int)(s[i]/mid);
tf-=m;
i--;
}
if(tf>0)
high=mid;
else
{
low=mid;
num=mid;
}
}
printf("%.4lf\n",num*PI);
}
}
return 0;
}