标签:
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6752 Accepted Submission(s):
2564
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 using namespace std; 7 int n,m; 8 double pi=acos(-1.0); //计算π的值,这样更精确 9 double a[10005]; 10 int xx(double x) 11 { 12 int num=0; 13 for(int i=0; i<n; i++) 14 { 15 num+=int(a[i]/x); //计算有多少块蛋糕大于此时的平均面积 16 } 17 if(num>=m) //如果有这么多块面积分给所有人,则满足题意 18 return 1; 19 else 20 return 0; 21 } 22 int main() 23 { 24 int T,i,j,r; 25 double v; 26 scanf("%d",&T); 27 while(T--) 28 { 29 scanf("%d%d",&n,&m); 30 m++; //加上自己要的一块 31 for(i=0; i<n; i++) 32 { 33 scanf("%d",&r); 34 a[i]=r*r*pi; //求出每块蛋糕的面积 35 v+=a[i]; //记录所有蛋糕的总面积 36 } 37 double max,l,r,mid; 38 sort(a,a+n); //二分之前一定要排序 39 max=v/m; //每个人平均分到的最大蛋糕就是蛋糕总面积的平均值 40 l=0.0,r=max; //面积从0到平均值二分 41 while((r-l)>1e-6) //满足这个精度则跳出循环(不了解精度问题,模仿别人的写法) 42 { 43 mid=(r+l)/2; //二分取中 44 if(xx(mid)) //判断,若满足,则最大蛋糕面积可能更大,则取后半段继续搜 45 l=mid; 46 else //若不满足,则蛋糕取大了,则取前半段继续搜 47 r=mid; 48 } 49 printf("%.4lf\n",l); //保留四位小数输出 50 } 51 }
标签:
原文地址:http://www.cnblogs.com/pshw/p/4847179.html