Problem:
给出n个圆的半径,体积均为1,分给f+1个人,每个人的体积相同,问最大的半径是多少?
Solution:
二分枚举半径,然后用每个圆去试能有几个这样的圆,如果满足,就尝试更高的。
note:
double输出要用%f,输入用%lf。
#include <cstdio>
#include <algorithm>
using namespace std;
const double PI = 3.141592653589793;
const double esp = 1e-6;
double rad[10010];
int main() {
int t;
scanf("%d", &t);
while(t--) {
double low = 0, high = 1e8, mid;
int n, f, cnt;
scanf("%d%d", &n, &f);
for(int i=1; i<=n; i++) {
scanf("%lf", &rad[i]);
rad[i] *= rad[i];
}
while((high-low) > esp) {
cnt = 0;
mid = (high+low)/2;
for(int i = 1; i <= n; i++)
cnt += rad[i]/mid;
if(cnt >= f+1)
low = mid;
else
high = mid;
}
printf("%.4f\n", mid * PI);
}
return 0;
}