hdu 1495 非常可樂 bfs

2021-07-09 09:24:14 字數 1756 閱讀 7354

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

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

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

7 4 3

4 1 3

0 0 0

no 3

思路:預處理m < n < s,以後處理方便點

初始狀態,m,n杯中可樂體積為0,s杯中體積為s;

然後分六種情況:

1, s 倒 m

2, s 倒 n

3, m 倒 n

4, m 倒 s

5, n 倒 m

6, n 倒 s

直到n,s杯中的可樂能等分(此時m杯中體積為0)為止,若不能等分,則輸出 no

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define n 101

#define inf 99999999

#define ll long long

using namespace std

;struct node

;int s, n, m;

int vis[n][n];

void bfs()

t2.cnt = t1.cnt + 1

; if (t1.x+t1.z > m) //s->m

else

if (!vis[t2.x][t2.y])

if (t1.y+t1.z > n) //s->n

else

if (!vis[t2.x][t2.y])

t2.x = t1.x

; //n->s

t2.y = 0

; t2.z = t1.y + t1.z

; if (!vis[t2.x][t2.y])

if(t1.x+t1.y>m) //n->m

else

if (!vis[t2.x][t2.y])

t2.x = 0

; //m->s

t2.y = t1.y

; t2.z = t1.z + t1.x

; if (!vis[t2.x][t2.y])

if (t1.x+t1.y>n) //m->n

else

if (!vis[t2.x][t2.y])

}cout << "no"

<< endl;

return ;

}int main()

if (n < m) swap(n, m);

bfs();

}return 0

;}

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 毫公升...