题意:
有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 }
浙公网安备 33010602011771号