HDU 1495 非常可樂 BFS

2021-08-02 21:58:18 字數 1689 閱讀 5179

傳送門

// 題意: 有乙個體積為s的瓶子, 有兩個體積為n, m的杯子, 問是否有可能將s體積的水平分成在兩個容器中各s/2. 有的話輸出最少要倒的次數,

思路 : 每一次倒水有六種方法,即(s->a ; s->b ; a->s ; a->b ; b->s ; b->a),我們要得到最少的倒的次數,當然就是用bfs咯.

每次將六中操作一一模擬入隊即可…..

(不過好像也可以用數論方面的知識做,聽說很簡單哦,可惜我數學太弱了,只能用最笨的bfs咯)

具體請看**:

const int maxn = 1e2+5

;int vis[maxn][maxn];

struct node ;

void solve()

int ans = s/2

; int flag = 0

; fill(vis, 0); vis[0][0] = 1;

queueq; q.push(node);

while(!q.empty())

if (u.a && u.b

1->2

node k = u;

if (n-u.b >= u.a) k.b += k.a, k.a = 0

; else k.a -= n - k.b, k.b = n;

if(!vis[k.b][k.c]) );}}

if (u.a && u.c

1->3

node k = u;

if (m-u.c >= u.a) k.c += k.a, k.a = 0

; else k.a -= m - k.c, k.c = m;

if(!vis[k.b][k.c]) );}}

if (u.b && u.a

2->1

node k = u;

if (s-u.a >= u.b) k.a += k.b, k.b = 0

; else k.b -= s - k.a, k.a = s;

if(!vis[k.b][k.c]) );}}

if (u.b && u.c

2->3

node k = u;

if (m-u.c >= u.b) k.c += k.b, k.b = 0

; else k.b -= m - k.c, k.c = m;

if(!vis[k.b][k.c]) );}}

if (u.c && u.a

3->1

node k = u;

if (s-u.a >= u.c) k.a += k.c, k.c = 0

; else k.c -= s - k.a, k.a = s;

if(!vis[k.b][k.c]) );}}

if (u.c && u.b

3->2

node k = u;

if (n-u.b >= u.c) k.b += k.c, k.c = 0

; else k.c -= n - k.b, k.b = n;

if(!vis[k.b][k.c]) );}}

}if (!flag) printf("no\n");

}}

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