由于一个人只能从一块饼上取,所以第一反应就是枚举最小Rmax 到Rmin 里面的半径,需要用二分进行筛选。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<list>
#include<string>
#include<sstream>
#include<ctime>
#include<cmath>
using namespace std;
#define _PI acos(-1.0)
#define INF 1 << 10
#define esp 1e-6
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> pill;
/*===========================================
===========================================*/
#define MAXD 10000 + 10
double pie[MAXD];
int n,m;
int solve(double r){
double s = _PI * r * r;
int ans = 0;
int k;
for(int i = 0 ; i < n ; i++){
double S = _PI * pie[i] * pie[i];
k = (int)(S / s);
ans += k;
}
return ans;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
m ++;
double L = 0,R = 0;
for(int i = 0 ; i < n ; i++){
scanf("%lf",&pie[i]);
R = max(R,pie[i]);
}
while((R - L) > 1e-8){
double mid = 1.0 * (R + L) / 2;
int cut = solve(mid);
if(cut >= m)
L = mid;
else
R = mid;
}
printf("%.4f\n",_PI * R * R);
}
return 0;
}