题意:有F+1个人来分N个圆形派,每个人得到的必须是一块整块派,而不是几块拼在一起的,且面积要求相同,求每个人最大能得到多大面积的派
思路:我们只需要算一共可以切出多少份面积为x的派,然后看看能不能分给F+1个人即可了,求x可以用二分
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
using namespace std;
#define maxn 10000+10
#define LL long long
int cas=1,T;
const double PI = acos(-1.0);
int n,f;
double A[maxn];
bool ok(double area)
{
int sum = 0;
for (int i = 0;i<n;i++)
sum+=floor(A[i]/area);
return sum>=f+1;
}
int main()
{
//freopen("in","r",stdin);
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&f);
double maxa=-1;
for (int i = 0;i<n;i++)
{
int r ;
scanf("%d",&r);
A[i]=PI*r*r;
maxa = max(maxa,A[i]);
}
double L=0;
double R=maxa;
while (R-L>1e-5)
{
double m = (L+R)/2;
if (ok(m))
L=m;
else
R=m;
}
printf("%.4lf\n",L);
}
//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
return 0;
}