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"=""> |
对于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;
}
(例如7个蛋糕分给3个人,先每人2个,剩下1个递归的时候分)