M 非常可樂

2021-08-14 21:33:35 字數 1610 閱讀 5387

大家一定覺的運動以後喝可樂是一件很愜意的事情,但是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

no

3

抽象的搜尋問題,

每次操作都有6個方向 (將三個杯子分別編號為0 ,1,2對應的full的容量為s,n,m)

1.     0->1(0號杯子往1號杯子裡面倒)

2.     2->1

3.     0->2

4.     1->2

5      1->0

6      2->0

將每次操作後杯子飲料的容量作為地圖map存放前兩個杯子飲料的容量 。(三個杯子飲料總和一定,前兩個確定,第三個也杯子內飲料的容量也就確定了,所以用兩個杯子就可以了)

這樣根據杯子倒水次數來廣搜,杯子的飲料的容量作為路徑去搜尋

1.方向陣列vis[6][3] 存每次操作對應的編號

2.full陣列存下對應編號杯子的最大容量

3.tiji陣列表示此次倒水之後對應編號的飲料的容量

4.map陣列以前兩個編號杯子的容量為下標,0表示出現過,1表示未出現過;

5.用個turn()函式來表示倒飲料的操作

map[i][j]=1,表示該狀態已經存在,下次再出現i ,j的情況時就不用去搜尋這種情況(未找到答案也是這因這種情況而停止的)

ps值得一提的是,沒有答案時說明倒水操作一直在乙個重複過的迴圈當中,//題外話,不要將這個看作解題的一部分(●'◡'●)

#include開三位陣列會超時,但這道題開個二維陣列就ok了,因為總量一定 前兩個的體積知道 第三個也就確定了

#include#include#include#include#include#define n 110

#includeusing namespace std;

int map[n][n],flag,s,n,m,ans,vis[6][3]=,,,,,},full[3],tiji[3];

double zhi;

struct node;

queuemmp;

void turn(int *aa,int *bb,int full)//a->b

else

*aa=a;

*bb=b;

return ;

}void dfs()

mmp.pop();

for(int i=0;i<6;i++)

}}void bfs()

}int main()

}

M 非常可樂

三個杯子,s,a,b分別代表它們的容量,s a b,先給s這個杯子倒滿水,a,b不倒水,要求是利用三個杯子平分s裡邊的水,問如果可以求倒水的次數 三個杯子可以互相倒水 還是用bfs來做,三個杯子有6種倒法,難點就在於,如何倒水,以及最後判斷是否平分,看了乙個大神的做法,他是用陣列的下標0,1,2來表...

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 題...