分派,每个人只能从其中一个派中取一部分,并且保证等分。就用二分了。
做的时候用C++提交没有问题,用G++提交,输出的时候必须是 %f(居然double 类型的也用%f)无解了。
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define LLEN 10005
#define PI 3.1415926535897932
double pie[LLEN];
int main() {
int t;
scanf("%d", &t);
while(t--) {
int n, f;
double sum = 0;
scanf("%d%d", &n, &f);
f++;
for(int i = 0; i < n; i++) {
scanf("%lf", &pie[i]);
pie[i] = pie[i]*pie[i];
sum += pie[i]*1.0;
}
double mid, high, low;
int count;
high = sum/f;
low = 0;
while(high - low > 0.000001) {
mid = (high+low)/2;
count = 0;
for(int i = 0; i < n; i++) {
count += (int)(pie[i]/mid);
}
if(count < f) high = mid;
else if(count >= f) low = mid;
}
printf("%.4f\n", (double)mid*PI);
}
return 0;
}