题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/C
题意:
我过生日请了F个朋友参加我的生日party,m个蛋糕,我要把它平均分给每个人(包括我),每个人的蛋糕都是整块整块的,并且分的蛋糕大小要一样(形状可以不一样),每块蛋糕都是圆柱,高度都是1。每个朋友(包括我)最多可以分到的蛋糕面积是多少。
案例:
input
3
3 3
4 3 3
1 24
5
10 5
1 4 2 3 4 5 6 5 4 2
output
25.1327
3.1314
50.2655
思路分析:
采用二分查找,找出最大的面积所在区间。
逐步的缩小范围,最后当左右端点相差小于0.00001时,即可取左端点为最大的面积。
确定是左是右区间时,可以记录每个蛋糕的可以分的人数的和,比较它与F的大小就可以但到目的。
源代码如下:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 using namespace std; 5 int N,F; 6 double are[10010]; 7 double pi=acos(-1.0); 8 bool judge(double area) 9 { 10 int count=0; 11 for(int i=0;i<N;i++) 12 { 13 count+=(int)(are[i]/area); //记录每个蛋糕可以分到的人数的总和 14 } 15 if(count>=(F+1)) return true; //不要忘记包括我 16 else return false; 17 } 18 void max_area(double maxn) 19 { 20 double l,r,mid; 21 l=0;r=maxn; 22 while(r-l>0.00001) //二分 23 { 24 mid=(l+r)/2; 25 if(judge(mid)) l=mid; 26 else r=mid; 27 } 28 printf("%.4f ",l); 29 } 30 int main() 31 { 32 int t,r; 33 cin>>t; 34 while(t--) 35 { 36 double maxn=-1; 37 cin>>N>>F; 38 for(int i=0;i<N;i++) 39 { 40 cin>>r; 41 are[i]=r*r*pi; 42 if(maxn<are[i]) 43 maxn=are[i]; 44 } 45 max_area(maxn); 46 } 47 return 0; 48 }