方法:二分。
题目意思:要过生日了,我请大家吃pie,然后人数一共是f+1(我自己)。每个人的pie不能是拼接的,而且每个人的面积是一样的,这样就用二分枚举。
范围是0~最大的那块pie。
然后用每一块去除枚举值,加到cnt上,当cnt>=f+1时候找大一点的面积, 否则找小一点的面积
pie的值要取得精确一点 , = =
另外在输出时候要是%f,如果用%lf会WA的。
上代码!
1 #include <stdio.h> 2 #include <math.h> 3 #define pie 3.1415926535897932384626433 4 double Pies[10000+10]; 5 int n,f; 6 double find(double mmax){ 7 int cnt; 8 int i; 9 double left=0; 10 double right=mmax; 11 double mid; 12 double res=0; 13 while(right-left>0.00001){ 14 mid=(right+left)/2; 15 cnt=0; 16 for(i=0;i<n;++i){ 17 cnt+= (int)(Pies[i]/(mid)); 18 } 19 if(cnt>=f){ 20 left=mid; 21 if(mid>res) 22 res=mid; 23 } 24 else right=mid; 25 } 26 return mid; 27 } 28 29 30 int main(){ 31 int i,j; 32 int Case; 33 double mmax; 34 double res; 35 while(~scanf("%d",&Case)){ 36 while(Case--){ 37 scanf("%d%d",&n,&f); 38 f++; 39 mmax=-1; 40 for(i=0;i<n;++i){ 41 scanf("%lf",&Pies[i]); 42 Pies[i]=pie*Pies[i]*Pies[i]; 43 if(Pies[i]>mmax) mmax=Pies[i]; 44 } 45 res=find(mmax); 46 printf("%.4f ",res); 47 } 48 } 49 return 0; 50 } 51