题目大意:给你N个派的半径,每个派都是圆形的,要求你对这些派进行切割,然后分给F+1个人,每个人得到的派的大小要一样,而且每个人的派都是一整块的而不是由若干块拼起来的,求每个人所得的派的最大值
解题思路:只能一一枚举了,一一枚举的话就用二分了,最大的上限肯定是最大面积的那个派,下限是0,然后一一枚举
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define maxn 10010
using namespace std;
int N, F;
const double PI = acos(-1.0);
double size[maxn];
bool judge(double t) {
int sum = 0;
for(int i = 0; i < N; i++)
sum += floor(size[i] / t);
return sum >= F + 1;
}
int main() {
int test;
scanf("%d",&test);
while(test--) {
scanf("%d%d", &N, &F);
int r;
double MAX_size = - 1.0;
for(int i = 0; i < N; i++) {
scanf("%d",&r);
size[i] = PI * r * r;
MAX_size = max(MAX_size,size[i]);
}
double L = 0.0, R = MAX_size;
double mid;
while(R - L > 1e-5) {
mid = (L + R) / 2;
if(judge(mid))
L = mid;
else
R = mid;
}
printf("%.4lf\n",L);
}
return 0;
}