题目大意:有n个派,f个朋友。然后要将派分给自己和这f个朋友。每个 朋友得到的派的面积是一样的,派不能组合起来。也就是说一个人只能拿到1块。要使得每个人拿到的面积最大,应该怎么分?求最大面积。
思路:这可不是求平均值,其实是二分。我们可以二分最大面积,然后扫一遍所有的派,看能不能分出f+1块这个面积的派。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const double pi = acos(-1.0);
double a[10010];
int n,f;
bool check(double mid)//看看这个面积下分出的块数够不够
{
int ans = 0;
for(int i = 0; i < n; i++)
ans += (int)(a[i] / mid);
if(ans < f + 1) return false;
return true;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&f);
double x = 0;
for(int i = 0; i < n; i++)
{
double r;
scanf("%lf",&r);
a[i] = r * r;
x = max(x,a[i]);
}
double l = 0, r = x, mid;
while(r - l > 1e-8)//二分面积
{
mid = (l + r) / 2;
if(check(mid)) l = mid;
else r = mid;
}
printf("%.4f\n",mid * pi);
}
return 0;
}