分数二分。。。模板题,二分一个答案
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const double pi = acos(-1.0);
const int MaxN = 10005;
int f , n;
double pie[MaxN];
bool ok(double area)//检验
{
int ans = 0;
for(int i = 0 ; i < n ; i++){
ans += floor(pie[i]/area);
}
if(ans >= f + 1) return 1;
else return 0;
}
int main()
{
int t;
scanf("%d", &t);
while(t--){
double maxa = -1;
int a;
scanf("%d %d",&n , &f);
for(int i = 0 ; i < n ; i++)
scanf("%d",&a) ,pie[i] = a*a*pi, maxa = max(pie[i] , maxa);
double l = 0 , r = maxa;
while(r - l > 1e-5){
double m = (l + r) / 2;
if(ok(m)) l = m ;
else r = m;
}
printf("%.4lf\n",l);
}
return 0;
}