課程練習二 1017非常可樂

2021-07-11 08:09:19 字數 2898 閱讀 8656

problem description

大家一定覺的運動以後喝可樂是一件很愜意的事情,但是seeyou卻不這麼認為。因為每次當seeyou買了可樂以後,阿牛就要求和seeyou一起分享這一瓶可樂,而且一定要喝的和seeyou一樣多。但seeyou的手中只有兩個杯子,它們的容量分別是n 毫公升和m 毫公升 可樂的體積為s (s<101)毫公升 (正好裝滿一瓶) ,它們三個之間可以相互倒可樂 (都是沒有刻度的,且 s==n+m,101>s>0,n>0,m>0) 。聰明的acmer你們說他們能平分嗎?如果能請輸出倒可樂的最少的次數,如果不能輸出"no"。

input

三個整數 : s 可樂的體積 , n 和 m是兩個杯子的容量,以"0 0 0"結束。

output

如果能平分的話請輸出最少要倒的次數,否則輸出"no"。

sample input

7 4 3

4 1 3

0 0 0

sample output

no3  

author

seeyou

思路: 如果要平分,肯定得是偶數,先判斷s是否為偶數;

對於可樂的轉移總共有6種情況,s->m 、s->n、 n->s、 n->m、 m->n、 m->s

先對s、m、n調整次序,使得s>n>m;

只要滿足:s=m+n或者m=s+n 即可 (2*s=s/ 2*m=s)

對於到可樂時注意判斷杯子是否被倒滿。

本來是按照上面的思路寫的,測試資料總是不過,原因 :  4 1 3 按照上面的思路應該輸出:2 。單例子給的是 :3

然後便找出老師上課講的課件,原來這道題的均分要s、n均分,不是均分就ok,

題幹不清晰 被誤導

剛開始思路的**;  

**:#include

#include

#include

#include

using namespace std;

int ans = 0;

bool flag[100][100];

struct data ;

bool bfs(int s,int n,int m)

if (q.n != n&&q.s>0)

else

d1.m = q.m;

d1.ans = q.ans + 1;

if (!flag[d1.m][d1.n])

} if (q.m !=m&&q.s>0)

else

d2.n = q.n;

d2.ans = q.ans + 1;

if (!flag[d2.m][d2.n])

} if (q.n != n)

else

d3.ans = q.ans + 1;

if (!flag[d3.m][d3.n])

} }

if (q.m > 0 )

} if (q.n >0)

else

d4.ans = q.ans + 1;

if (!flag[d4.m][d4.n])

} if (q.s!= s)

else

d5.m = q.m;

if (!flag[d5.m][d5.n])

} }

if (q.m == q.n&&q.m == q.s)

} return false; }

int main()

ans = 0;

if (s % 2 != 0)

cout << "no" << endl;

else

} system("pause");

return 0; }

ac**:(只需要該一下終止判斷條件就行,其他的和上面一樣)

#include

#include

#include

#include

using namespace std;

int ans = 0;

bool flag[100][100];

struct data ;

bool bfs(int s,int n,int m)

if (q.n != n&&q.s>0)

else

d1.m = q.m;

d1.ans = q.ans + 1;

if (!flag[d1.m][d1.n])

} if (q.m !=m&&q.s>0)

else

d2.n = q.n;

d2.ans = q.ans + 1;

if (!flag[d2.m][d2.n])

} if (q.n != n)

else

d3.ans = q.ans + 1;

if (!flag[d3.m][d3.n])

} }

if (q.m > 0 )

} if (q.n >0)

else

d4.ans = q.ans + 1;

if (!flag[d4.m][d4.n])

} if (q.s!= s)

else

d5.m = q.m;

if (!flag[d5.m][d5.n])

} }

if (q.m == q.n&&q.m == q.s)

} return false; }

int main()

ans = 0;

if (s % 2 != 0)

cout << "no" << endl;

else

} system("pause");

return 0; }

練習二 1017 非常可樂

題目 大家一定覺的運動以後喝可樂是一件很愜意的事情,但是seeyou卻不這麼認為。因為每次當seeyou買了可樂以後,阿牛就要求和seeyou一起分享這一瓶可樂,而且一定要喝的和seeyou一樣多。但seeyou的手中只有兩個杯子,它們的容量分別是n 毫公升和m 毫公升 可樂的體積為s s 101 ...

1017 非常可樂

problem description 大家一定覺的運動以後喝可樂是一件很愜意的事情,但是seeyou卻不這麼認為。因為每次當seeyou買了可樂以後,阿牛就要求和seeyou一起分享這一瓶可樂,而且一定要喝的和seeyou一樣多。但seeyou的手中只有兩個杯子,它們的容量分別是n 毫公升和m 毫...

1017 非常可樂

題意 要求將一瓶可樂平均分成份,問能否平均分成兩份,如果能輸出最少需要幾次否則輸出no題目給出三個整數 s n m s表示可樂總量 n m分別為兩個杯子的容量 且 s n m 思路 先將m,n按大小排序 小的設為m 由 s 0 0 狀態 轉換到 0 s 2 s 2 的狀態且要找出最優解,用bfs 題...