ACM pie
我的生日快到了,傳統上我正在做餡餅。不只是一個餡餅,不,我有N個,各種口味和各種尺寸。?數量為F我的朋友會來到我的聚會,每個人都得到一個餡餅。?這應該是一塊餡餅,而不是幾個小塊,因為看起來很亂。這一塊可以是一整塊。
我的朋友們很煩人,如果他們中的一個比其他人得到更大的一塊,他們就會開始抱怨。因此,他們所有人都應該得到同樣大小(但不一定是同樣的形狀)的碎片,即使這導致了一些餡餅被破壞(這比破壞聚會更好)。?當然,我也想要一塊餡餅,那塊也應該是同樣大小的。
我們所有人都可以獲得最大的可能尺寸是多少?所有的餡餅都是圓柱形的,它們都具有相同的高度1,但餡餅的半徑可能不同的。
就是我要開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 }
我的朋友們很煩人,如果他們中的一個比其他人得到更大的一塊,他們就會開始抱怨。因此,他們所有人都應該得到同樣大小(但不一定是同樣的形狀)的碎片,即使這導致了一些餡餅被破壞(這比破壞聚會更好)。?當然,我也想要一塊餡餅,那塊也應該是同樣大小的。
我們所有人都可以獲得最大的可能尺寸是多少?所有的餡餅都是圓柱形的,它們都具有相同的高度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 2Sample 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了
轉載于:https://www.cnblogs.com/jj81/p/7405391.html
總結
- 上一篇: 手机用appnium,web自动化用ec
- 下一篇: 知道不知道 (刘若英演唱歌曲)