题意:有f + 1个人要来分派吃,每个人得到的派的面积必须相等,且得到的都是整块的而不是拼起来的,问每个人最多得到多少面积的派。
题解:二分法,把每块派的面积除以x,并都向下取整加起来是sum,如果sum大于等于f +1说明这个面积是可以的,x增大,否则x减小。
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
const int N = 10005;
const double PI = acos(-1.0);
int n, f;
double s[N];
bool judge(double x) {
int sum = 0;
for (int i = 0; i < n; i++)
sum += floor(s[i] / x);
if (sum >= f + 1)
return true;
return false;
}
int main() {
int t, radii;
scanf("%d", &t);
while (t--) {
scanf("%d%d", &n, &f);
double l = 0, r = -1;
for (int i = 0; i < n; i++) {
scanf("%d", &radii);
s[i] = PI * radii * radii;
r = max(r, s[i]);
}
while (r - l > 1e-5) {
double mid = (l + r) / 2;
if (judge(mid))
l = mid;
else
r = mid;
}
printf("%.4lf\n", l);
}
return 0;
}