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