#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
const double eps = 1e-6;
const double PI = 3.14159265359;
double v[10010];
int main()
{
int n, t, f, i, r1;
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &f);
f++;
double r = 0, l = eps, mid;
for (i = 0; i < n; i++)
{
scanf("%d", &r1);
v[i] = r1 * r1 * PI; // 计算体积;
r += v[i]; // 累加总体积;
}
r/=f; //特别重要,如果不除f会影响精度。导致一个测试点不通过
while (r - l > eps)
{
int sum = 0;
mid = (l + r) / 2.0;
for (i = 0; i < n; i++)
sum += (int)(v[i] / mid); // 块当然是整块(int);
if (sum >= f) // 确定够分,求最大值,改变下边界;
l = mid;
else
r = mid; // 如果每一小块过大,改变上边界;
}
printf("%.4lf\n", mid);
}
}
这个题目数据精度要求较高,最后一定返回mid才能满足要求。否则会有测试点过不去