題目:
大家一定覺的運動以後喝可樂是一件很愜意的事情,但是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 3sample output4 1 3
0 0 0
no思路:3
實質上是有向圖上求最短路,只需要模擬加記憶化即可。
code:
1 #include2using
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 毫公升...