题目:http://poj.org/problem?id=3122
AC代码(C++):
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <queue>
#include <map>
#include <math.h>
#include <string>
#include <string.h>
#include <bitset>
#define INF 0x7fffffff
#define eps 1e-5
#define MAXN 100105
#define PI 3.14159265358979323846
using namespace std;
int N,F;
double r[10005];
int main(){
int t;
cin>>t;
while(t--){
cin>>N>>F;
F++;
double low = 0.0;
double high = 0.0;
double mid;
for(int i = 0; i < N; i++){
cin>>r[i];
if(PI*r[i]*r[i]-high>eps)high = PI*r[i]*r[i];
}
int cnt = 0;
double size;
while(high-low>eps){
mid = (low+high)/2;
cnt = 0;
for(int i = 0; i < N; i++){
size = PI*r[i]*r[i];
if(mid-size>eps)continue;
while(size-mid>eps){
size-=mid;
cnt++;
}
}
if(cnt<F)high = mid;
else low = mid;
}
printf("%.4lf\n",mid);
}
}
总结: 浮点数的二分搜索. 很坑爹的是, 题目没有说结果保留几位小数但实际只有保留4位才正确.