题意:
F+1个人,分N个圆形派(给出其半径),每个人必须得到的是整块派(不能由几块拼在一起),求每个人能分到的最大面积的派。
思路:
二分搜索最大面积的派,判断是否可行。
代码:
#include <iostream>
#include <string.h>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 10005;
const double PI = acos(-1.0);
int n, f;
double pie[maxn];
int Judge(double x) {
int sum = 0;
int i;
for (i = 0; i < n; i++)
sum += floor(pie[i] / x);
if (sum >= f + 1)
return true;
else
return false;
}
int main() {
int cas = 0;
double r, Max ;
scanf("%d",&cas);
while (cas--) {
scanf("%d%d", &n, &f);
int i;
Max = 0;
for (i = 0; i < n; i++) {
scanf("%lf", &r);
pie[i] = PI*r*r;
Max = max(Max, pie[i]);
}
double L, R, mid;
L = 0,R = Max;
while (R-L > 1e-5) {
mid = (L + R) / 2;
if (Judge(mid))
L = mid;
else
R = mid;
}
printf("%.5lf\n", L);
}
return 0;
}