题目链接:http://poj.org/problem?id=3122
--------------------------------------------------------
题意:每人只能从一个派里面切割,要求每个人的派的面积相等,求这个最大面积。
思路:二分法,下限是所有人从最小的里面切割,上限是所有派都完全分割。每次进行二分,判断解是否可行,通过可行性,对上下限进行调整,最终得到结果。
代码:
#include <cstdio> #include <cmath> int N =0; int F=0; double pim =0; double sum=0; const int MAXN =10000+10; double r[MAXN]; double pie[MAXN]; const double PI =acos(-1.0); const double eps=1e-6; int jud(double mid){ int count=0; for(int i=0;i<N;i++){ count+=(int)(pie[i]/mid); } if(count>=(F+1)) return 1; else return 0; } double proce(){ double left =pim/(F+1); double right=sum/(F+1); double mid= (left+right)/2; while(right-left>eps){ mid= (left+right)/2; if (jud(mid)){ left = mid; }else{ right =mid; } } return mid; } int main(void){ int T=0; scanf("%d",&T); for(int i=0;i<T;i++){ pim=0; sum=0; scanf("%d %d",&N,&F); for(int j=0;j<N;j++){ scanf("%lf",&r[j]); pie[j]=PI*r[j]*r[j]; if(pie[j]>pim) pim=pie[j]; sum+=pie[j]; } double ans = proce(); printf("%.4f\n",ans); } return 0; }