题意:
有F+1个人来分n个圆形派,每个人分到的必须是一个整块的派,形状无所谓,每个人分到的必须一样多,给你每个派的半径,问每个人能分到的最大派的面积是多少。
思路:
虽然不是求最小的最大或是最大的最小,但是这个题目依然可以用二分去做,我们枚举每个人分到的最大面积,这样就可以算出来这些派最多能够满足几个人的要求,然后去判断二分的方向,一开始eps写的有点小,TLE了一次,后来改大点AC了。
#include<stdio.h>
#include<math.h>
#define N 10000 + 10
#define eps 0.000001
double PI = acos(-1.0);
double ps[N];
bool ok(int mid ,int n ,int m)
{
int Sum = 0;
for(int i = 1 ;i <= n ;i ++)
{
Sum += int(ps[i] / mid);
}
return Sum >= m;
}
int main ()
{
int n ,m ,i;
double r ,Max;
while(~scanf("%d %d" ,&n ,&m))
{
Max = 0;
for(i = 1 ;i <= n ;i ++)
{
scanf("%lf" ,&r);
ps[i] = PI * r * r;
if(Max < ps[i]) Max = ps[i];
}
double low ,mid ,up ,Ans = 0;
low = 0 ,up = Max;
while(up - low >= eps)
{
mid = (low + up) / 2;
if(ok(mid ,n ,m + 1))
Ans = low = mid;
else up = mid;
}
printf("%.5lf
" ,Ans);
}
return 0;
}