我的生日快到了,传统上我正在做馅饼。不只是一个馅饼,不,我有N个,各种口味和各种尺寸。 数量为F我的朋友会来到我的聚会,每个人都得到一个馅饼。 这应该是一块馅饼,而不是几个小块,因为看起来很乱。这一块可以是一整块。
我的朋友们很烦人,如果他们中的一个比其他人得到更大的一块,他们就会开始抱怨。因此,他们所有人都应该得到同样大小(但不一定是同样的形状)的碎片,即使这导致了一些馅饼被破坏(这比破坏聚会更好)。 当然,我也想要一块馅饼,那块也应该是同样大小的。
我们所有人都可以获得最大的可能尺寸是多少?所有的馅饼都是圆柱形的,它们都具有相同的高度1,但馅饼的半径可能不同的。
我的朋友们很烦人,如果他们中的一个比其他人得到更大的一块,他们就会开始抱怨。因此,他们所有人都应该得到同样大小(但不一定是同样的形状)的碎片,即使这导致了一些馅饼被破坏(这比破坏聚会更好)。 当然,我也想要一块馅饼,那块也应该是同样大小的。
我们所有人都可以获得最大的可能尺寸是多少?所有的馅饼都是圆柱形的,它们都具有相同的高度1,但馅饼的半径可能不同的。
Input
一行为正整数:测试用例数。 然后对于每个测试用例:
---一行与两个整数N和F与1 <= N,F <= 10000:饼的数量和朋友的数量。
---一行N个整数ri与1 <= ri <= 10000:馅饼的半径。
Output
对于每个测试用例,输出一行,最大可能体积V,这样我和我的朋友们都能得到一块馅饼的大小,答案应该是作为一个浮点数而且绝对误差最多10 ^(-3)。
Sample Input
3 3 3 4 3 3 1 24 5 10 5 1 4 2 3 4 5 6 5 4 2
Sample Output25.1327
3.1416 50.2655
就是我要开party了,朋友来了,我要均分n块馅饼给自己和朋友们,但是呢,每个人只能得到一块馅饼,不能有拼接的馅饼块。
按道理 人数应该为f+1了,
想一想,一种馅饼可能分给好几人食用,我可以用二分法在0和最大馅饼块之间先求出预设的最大值 ,然后让每种馅饼除以预设的最大值,取整,得到块数,当所有的累加的块数大于总人数的时候,即该值满足题意.
1 #include<bits/stdc++.h> 2 using namespace std; 3 const double PI = acos(-1.0); 4 double pie[10005]; 5 6 int t,n,f;/*t:次数 n:馅饼的数量 f:朋友数量,因为自己也要分馅饼,所以记得要有 f++*/ 7 bool cmp(double a,double b) 8 { 9 return a > b; 10 } 11 int judge(double mid) /*判断预设的最大值是否满足题意*/ 12 { 13 int sum = 0; 14 for(int i = 0; i < n; i++) 15 { 16 sum += int(pie[i]/mid); 17 if(sum >= f) 18 return 1; 19 } 20 return 0; 21 } 22 int main() 23 { 24 while(cin>>t) 25 { 26 27 while(t--) 28 { 29 double right,left,mid; 30 scanf("%d %d",&n,&f); 31 f++; 32 for(int i = 0 ;i < n; i++) 33 { 34 scanf("%lf",&pie[i]); 35 pie[i] = pie[i]*pie[i]*PI; /*改为存储pie的体积,方便之后的运算*/ 36 } 37 sort(pie,pie+n,cmp); /*排序完成之后 直接拿第一个来开刀*/ 38 left = 0; 39 right = pie[0]; 40 while(right - left > 1e-7) 41 { 42 mid = (left+right)/2; 43 if(judge(mid)) 44 left = mid; 45 else 46 right = mid; 47 } 48 printf("%.4lf\n",mid); 49 } 50 } 51 52 return 0; 53 }
一些奇奇怪怪的事情:(其实,不是很奇怪,就是取值范围的问题)
当right-left>1e-5时,输出mid是WA 输出left反而是AC
当right-left>le-6或者1e-7时 输出mid是AC
当right - left>1e-8或者更小的时候,就OLE了