浮点型答案的二分。注意精度问题。关键代码:
while (R - L > 1e-5) {
double M = (L + R) / 2;
if (check(M)) L = M;
else R = M;
}
完整代码:
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cctype>
#include <cstdlib>
#include <iostream>
#include <string>
#include <map>
#include <vector>
#define MAXN 10010
using std::cin;
using std::cout;
using std::endl;
using std::map;
using std::string;
using std::vector;
using std::min;
using std::max;
int N, F;
const double PI = acos(-1.0);
double area[MAXN];
bool check(double a) {
int sum = 0;
for (int i = 0; i < N; ++ i) {
sum += floor(area[i] / a);
}
if (sum >= F) return true;
return false;
}
int main() {
//freopen("input.in", "r", stdin);
int t;
cin >> t;
while (t --) {
cin >> N >> F;
F ++;
double Max = -1.0;
for (int i = 0; i < N; ++ i) {
double r;
scanf("%lf", &r);
area[i] = PI * r * r;
Max = max(area[i], Max);
}
double L = 0, R = Max;
while (R - L > 1e-5) {
double M = (L + R) / 2;
if (check(M)) L = M;
else R = M;
}
printf("%.4lf\n", L);
}
}