题目链接:https://vjudge.net/problem/POJ-3122
题意:有n块饼,m+1个人,将饼均分成m+1块,求每块最大的大小。
思路:水二分,显然每块的大小与可以给多少人吃具有单调性,满足二分的性质。下限为0,上限为sum/(m+1)。
AC代码:
#include<cstdio> #include<algorithm> #include<cmath> #include<cstdlib> using namespace std; const int maxn=1e4+5; const double PI=acos(-1); int T,n,m; double a[maxn],sum; int check(double x){ int num=0; for(int i=n;i>=1;--i){ num+=a[i]/x; if(num>m) break; } return num; } int main(){ scanf("%d",&T); while(T--){ sum=0; scanf("%d%d",&n,&m); m+=1; for(int i=1;i<=n;++i){ scanf("%lf",&a[i]); a[i]=PI*a[i]*a[i]; sum+=a[i]; } sort(a+1,a+n+1); double l=0.0,r=sum/m,mid; while(l<=r){ mid=(l+r)/2; if(check(mid)>=m) l=mid+(1e-5); else r=mid-(1e-5); } printf("%.4f\n",r); } return 0; }