HDU 2.1.3 Cake

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;
}


(例如7個蛋糕分給3個人,先每人2個,剩下1個遞歸的時候分)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章