HDU 1495 非常可樂 (BFS 記憶化)

2022-07-13 04:06:09 字數 2047 閱讀 6965

題目:

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

思路:

實質上是有向圖上求最短路,只需要模擬加記憶化即可。

code:

1 #include2

using

namespace

std;

3bool vis[100][100][100];4

5 typedef struct

node;

1112

bool ok(int a, int b, int

c)18

19int bfs(int s, int n, int

m);22

q.push(s);

23 vis[s][0][0] = 1;24

int ans = 0;25

while(!q.empty())

32else

33if (!vis[na][nb][nc]); q.push(ns);

35 vis[na][nb][nc] = 1;36

}37if (s.a > m-s.c)

38else

39if (!vis[na][nb][nc]); q.push(nns);

41 vis[na][nb][nc] = 1;42

}43}44

if(s.b)

46else

47if (!vis[na][nb][nc]); q.push(ns);

49 vis[na][nb][nc] = 1;50

}51 na = s.a+s.b; nb = 0; nc =s.c;

52if (!vis[na][nb][nc]); q.push(nns);

54 vis[na][nb][nc] = 1;55

}56}57

if(s.c)

59else

60if (!vis[na][nb][nc]); q.push(ns);

62 vis[na][nb][nc] = 1;63

}64 na = s.a+s.c; nc = 0; nb =s.b;

65if (!vis[na][nb][nc]); q.push(nns);

67 vis[na][nb][nc] = 1;68

}69}70

}71return0;

72}7374

intmain()

7584

85return0;

86 }

hdu 1495 非常可樂 bfs

題目 剛開始那做這個題 怎麼也想不出為什麼可以用bfs 我認為做這個題目 你想到有6種情況哦 假設s 是瓶子 n,m 是有容量的杯子,s可以倒入n中 s也可以倒入m中 n可以倒入s中 n 也可以倒入m中 m也是一樣的哦 所以就有六種情況哦。下面看具體ac 裡面有註解哦 include include...

HDU 1495 非常可樂 (BFS)

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

hdu 1495 非常可樂 bfs

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