题目的思路是:二分法。首先将pie按照半径大小排序,找出最大的pie。计算此时区间(0,max)的中值,然后中值代表的size来分pie,如果分得的人数是比当前分pie的人数要多,则取区间的右半部分,否则,取区间的左半部分。
代码如下:
#include<iomanip>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stdio.h>
using namespace std;
const double pi = 3.14159265358979323846;
int pieNum, friendNum;
int pie[10005];
double binary(double min, double max){
double middle;
int count = 0;
while(max-min > 1e-5){
count = 0;
middle = (max+min)/2;
for(int i = 0; i < pieNum; ++i){
count += int(pi * pie[i] * pie[i] / double(middle));
}
if(count >= friendNum+1)
min = middle;
else
max = middle;
}
return middle;
}
bool cmp(const int& a, const int& b){
return a < b;
}
int main(){
int cas;
cin >> cas;
while(cas--){
cin >> pieNum >> friendNum;
memset(pie, 0, sizeof(pie));
for(int i = 0; i < pieNum; ++i)
cin >> pie[i];
sort(pie, pie+pieNum, cmp);
printf("%0.4f\n", binary(double(0), double(pie[pieNum-1]*pie[pieNum-1] * pi)));
}
}
这里要注意pi的精度问题。首先pi要是一个double类型,而且精度不能小于3.14159265358,否则会出现wa。