题干:
大意是f+1个人来分n个圆形派(每个的大小不一定相同)。每个人必须分得一整块,而且每个人分得的面积相同。求每个人分得的最大面积是多少。
分析:
看了看书上的分析,就是采用二分法,查找到合适的面积x,使得问题转化为“能否可以让每人得到一块x的派”。
代码:
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
const int maxn = 10010;
double num[maxn];
int n,f;
const double PI = acos(-1.0);
bool ok(double m)//判断是否满足面积为x的时候,有足够的派分给f+1个人
{
int sum = 0;
for(int i = 0;i < n;i++)
{
sum += floor(num[i] / m);
}
return sum >= (f + 1);
}
int main()
{
int T;
cin>>T;
while(T--)
{
memset(num,0,sizeof(num));
scanf("%d%d",&n,&f);
int x;
double maxa = -1;
for(int i = 0;i < n;i++)
{
cin >> x;
num[i] = PI * x * x;
maxa = max(maxa,num[i]);
}
double mina = 0;
while(maxa - mina > 1e-5)
{
double M = (maxa + mina) / 2;
if(ok(M))
mina = M;
else
maxa = M;
}
printf("%.4lf\n",mina);
}
return 0;
}