HDU 1495 非常可樂 (BFS)

2021-07-08 09:02:09 字數 1967 閱讀 9749

problem description

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

看著題目的時候,感覺題意講的有點不清楚,剛開始想的時候覺得 可以一邊倒一邊喝,或者 只要乙個杯子裡面達到總量的一半就可以了,後來發現,,需要有兩個杯子裡面的量需要相等。這樣就可以直接排除總量是奇數的情況,因為都是整數。然後剩下的就是各種情況討論了,總共有三個杯子,第乙個總量也算。所以操作的方法總共有六種,設三個杯子為a,b,c; a->b, a->c , b->a,b->c,c->a,c->b;這六種情況討論 因為求最少次數,可以用bfs的思想,只要到達結果的那種情況,就停止 輸出答案。

#include #include #include #include using namespace std;

struct node

;int s,n,m; //三個杯子的容量

int res = -1; //初始化最後結果

int vis[500][500]; //訪問標記

queue q; //定義乙個佇列

void bfs()

); vis[0][0] = 1;

while (!q.empty())

return ;

}q.pop();

if (now.n < n) //如果第二杯子沒有滿);}

if ( now.s < n-now.n && !vis[now.n+now.s][now.m]) //如果第乙個杯子中的量裝不滿第二個);}

if (now.m >= n - now.n && !vis[n][now.m - n + now.n]) //第三個杯子中的量可以裝滿第二個杯子);}

if ( now.m < n-now.n && !vis[now.n+now.m][0]) //第三個杯子中的量不可以裝滿第二個杯子);}

}if (now.m < m) //後面的情況類似);}

if ( now.s < m-now.m && !vis[now.n][now.m + now.s]));}

if (now.n >= m - now.m && !vis[now.n - m + now.m][m]));}

if ( now.n < m-now.m && !vis[0][now.m + now.n]));}

}if (now.s < s) //因為第乙個杯子最大,,所以不存在後面的某個杯子能裝滿 所以不用討論);}

if ( now.m < s-now.s && !vis[now.n][0]));}

}}

}int main()

if (s % 2 != 0 ) //如果總量是奇數,不可能被平分

bfs();

if ( res == -1 )

else

}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

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

HDU 1495 非常可樂 (BFS)

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