Cake |
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) |
Total Submission(s): 2586 Accepted Submission(s): 1238 |
Problem Description
一次生日Party可能有p人或者q人蔘加,現準備有一個大蛋糕.問最少要將蛋糕切成多少塊(每塊大小不一定相等),才能使p人或者q人出席的任何一種情況,都能平均將蛋糕分食.
|
Input
每行有兩個數p和q.
|
Output
輸出最少要將蛋糕切成多少塊. |
Sample Input
2 3 |
Sample Output
4 <div style="" font-size:="" 14px;="" border-top:="" #b7cbff="" 1px="" dashed;="" font-family:="" times"=""> Hint 將蛋糕切成大小分別爲1/3,1/3,1/6,1/6的四塊即滿足要求.
當2個人來時,每人可以喫1/3+1/6=1/2 , 1/2塊。
當3個人來時,每人可以喫1/6+1/6=1/3 , 1/3, 1/3塊。
|
對於m和n個人,假設m>=n
可以把問題等價位“把m個蛋糕分給n個人,需要切多少份”
當m或者n等於0的時候,自然是0份
當m=n的時候,自然是m份
當m>n的時候,先平均分一部分,使得剩下的蛋糕少於n個,剩下的遞歸解決
(例如11個蛋糕分給3個人,先每人3個,剩下2個遞歸的時候分)
當m<n的時候,先把蛋糕分給 k個人,使得 m*k<n m*(k+1)>n,剩下的遞歸解決
(例如3個蛋糕分給11個人,先給3+3+3個人分了,剩下的3個小蛋糕給剩下的2人分)
菜鳥級的原創代碼,已AC。若有可提高之處歡迎指導
#include<stdio.h>
int cake(int x, int y)
{
if (x*y == 0)
return 0;
if (x == y)
return x;
if (x > y)
return (x / y)*y + cake(x%y, y);
if (x < y)
return (y / x)*x + cake(x, y - (y / x)*x);
}
int main()
{
int a , b ;
while (scanf("%d", &a) == 1 && scanf("%d", &b) == 1)
printf("%d\n", cake(a,b));
return 0;
}