很明显,二分面积就可以求解。
//
// main.cpp
// Richard
//
// Created by 邵金杰 on 16/9/30.
// Mail:1016427040@qq.com or jasonshaosjj@gmail.com
// Copyright © 2016年 邵金杰. All rights reserved.
//
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=10000+10;
const double eps=1e-5;
const double pi=acos(-1.0);
double area[maxn];
int n,f;
bool check(double mid)
{
int sum=0;
for(int i=0;i<n;i++) sum+=floor(area[i]/mid);
return sum>=f+1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&f);
double ri,maxr=-1;
for(int i=0;i<n;i++){
scanf("%lf",&ri);
area[i]=pi*ri*ri;
maxr=max(area[i],maxr);
}
double l=0,r=maxr;
double mid;
while(r-l>eps)
{
mid=(l+r)/2;
if(check(mid)) l=mid;
else r=mid;//浮点数二分不能像整数那样直接加1,只能把左右指针移到中间那个点
}
printf("%.4f\n",l);
}
return 0;
}