题目链接:
这道题虽然不是一道典型的二分答案题,但同样也可以用二分答案来做。
来二分面积为$area$的派,然后看看条件是否矛盾。
与其矛盾的便是$f+1$个人是否每个人都会有。
一个半径为$r$的派只能切出$floor(pi r^2/x)$块。
AC代码:
1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 7 const double PI=acos(-1.0); 8 const int maxn=10005; 9 10 int n,f; 11 double A[maxn]; 12 13 bool ok(double area){ 14 int sum=0; 15 for(int i=0;i<n;i++) sum+=floor(A[i]/area); 16 return sum>=f+1; 17 } 18 19 int main(){ 20 int T; 21 scanf("%d",&T); 22 while(T--){ 23 scanf("%d%d",&n,&f); 24 double maxa=-1; 25 for(int i=0;i<n;i++){ 26 int r; scanf("%d",&r); 27 A[i]=PI*r*r; 28 maxa=max(maxa,A[i]); 29 } 30 double L=0,R=maxa; 31 while(R-L>0.00001){ 32 double M=(L+R)/2; 33 if(ok(M)) L=M; else R=M; 34 } 35 printf("%.4lf ",L); 36 } 37 return 0; 38 }