poj3122 pie

方法:二分。

题目意思:要过生日了,我请大家吃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             
原文地址:https://www.cnblogs.com/symons1992/p/3551889.html