题意:每组测试案例包括了,蛋糕的块儿数,、朋友数,以及所有高度为1的 圆柱形蛋糕的半径,要求从这些蛋糕中分一块分别给朋友和自己(F+1),并且每一块蛋糕要来自同一块儿大蛋糕,因为这样看起来美观,求最后每个人得到的蛋糕大小 pi*S
#include<iostream>
#include<cstdio>
#include<algorithm>
#define pi 3.14159265358979
using namespace std;
const int maxn = 10010;
int N , F;
int R[maxn];
double S[maxn];
double tS[maxn];
bool ok(double mid) {
int P = 0;//朋友个数
int tn = N - 1;//蛋糕下标号
for (int i = 0 ; i < N ; i ++)
tS[i] = S[i];//开始没有做S的备份 减完之后S改变 显然不对
while (tn>=0) {
if(tS[tn] - mid >=0){
tS[tn] = tS[tn] - mid;
P ++;
if (P == F+1) return true; //等于F+1
}
else{
tn --;
}
}
return false;
}
int main() {
int T , i;
scanf("%d",&T);
while (T --) {
double sum = 0;
scanf("%d%d",&N,&F);
for (i = 0; i < N ; i ++) {
scanf("%d",&R[i]);
S[i] = double(R[i]*R[i]);
}
sort(S , S + N);
// printf("right = %f\n",S[N-1]);
double left , right , mid;
left = 0;
right = S[N-1];
double ans;
while ((right-left)>=1e-8) {
mid = (left+right)/2;
if(ok(mid)) {
//printf("left=%f\n",left);
ans = mid;
left = mid + 1e-5; //能分的话 那么在加一些
}
else {
//printf("right=%f\n",right);
ans = mid;
right = mid - 1e-5; //不能分的话 再减一些
}
}
printf("%.4f\n",pi*ans);
}
}