题意:

有n个pie(高度为1),f个朋友(算上自己,共有f+1个人),输入这n个pie的半径,若要把这些pie公平的分给f+1个人(每个人得到的pie的尺寸要相同,但形状不必完全一致),每个人得到的那份pie必须是从一个pie上取出的(one piece of one pie)

思路:

二分,下界是0,也就是每个人都没有pie,上界是pie中最大的一个,也就是所有pie都是一样的情况。

mid = (left + right)/2,对于每一个pie计算能够分的人数,然后根据能够分的总人数更新left/right的值

 

WA的话,注意精度(WA了一次因为PI的精度不够)

 

 1 #include<ctime>
 2 #include<iostream>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cmath>
 6 
 7 using namespace std;
 8 #define PI acos(-1.0)
 9 double r[10005];
10 int main()
11 {
12     int T;
13     cin>>T;
14     while(T--)
15     {
16         memset(r,0,sizeof(r));
17         double lef = 0.0;//下界 
18         double righ = 0.0;//上界 
19         int p,f;
20         cin>>p>>f;
21         for(int i = 1;i<=p;i++)
22         {
23             cin>>r[i];
24             r[i] *= (PI*r[i]);
25             if(righ<r[i]) righ = r[i];//上界是最大的PIE的尺寸 
26         }
27         double mid;
28         while(righ - lef > 0.00001)
29         {
30             mid = (lef + righ) / 2;
31             int cnt = 0;
32             for(int i = 1;i<=p;i++)
33             {
34                 cnt += int(r[i] / mid);
35             }
36             if(cnt<f+1) righ = mid;
37             else lef = mid;
38         }
39         printf("%.4lf\n",mid);
40     }
41     return 0;
42 }

 

posted on 2019-03-21 18:20  IceeeE  阅读(68)  评论(0)    收藏  举报