日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU1495 非常可乐

發布時間:2025/1/21 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU1495 非常可乐 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題鏈接HDU1495 非常可樂。

題意簡述:平分液體問題。輸入s、n和m三個數,分別代表可樂和2個杯子,三個容器可以互相倒,問能不能把s中的可樂平分,能的話輸出最小倒杯子的次數,不能就輸出NO。

問題分析:開始的時候,所有可樂在s中,2個杯子n和m都空著。過程中,可以將任何1個容器中的可樂倒到另外某個容器中,或將目標容器倒滿,或將源容器倒空。因為容器沒有刻度,只能這樣。這個過程中,如果出現某個容器空,另外2個容器可樂相同則成功。如果開始的時候,可樂的容量是奇數,則不可能平分可樂。容器間可樂倒來倒去,每次有6種倒法,對這6種倒法進行試探即可。求的是最少倒的次數,所以可以用BFS實現。

程序說明:搜索過的狀態就不需要再搜索了,用數組notvist[][][]來標記搜索過的狀態。

AC的C++語言程序如下:

/* HDU1495 非常可樂 */#include <iostream> #include <queue> #include <cstring> #include <cstdio>using namespace std;const int MAXN = 100;int s, n, m, s2; bool notvist[MAXN+1][MAXN+1][MAXN+1];struct node {int s, n, m, level; };int bfs() {if(s % 2 == 1)return -1;queue<node> q;s2 = s / 2;memset(notvist, true, sizeof(notvist));node f;f.s = s;f.n = 0;f.m = 0;f.level=0;q.push(f);notvist[f.s][f.n][f.m] = false;while(!q.empty()) {f = q.front();q.pop();if((f.s == f.n && f.s == s2) || (f.s == f.m && f.s == s2) || (f.m == f.n && f.m == s2))return f.level;node v;// s --> nif(f.s && n - f.n > 0) {if(f.s > n - f.n) { // s > n的剩余容量v.s = f.s - (n - f.n);v.n = n;v.m = f.m;} else { // s <= n的剩余容量v.s = 0;v.n = f.n + f.s;v.m = f.m;}if(notvist[v.s][v.n][v.m]) {notvist[v.s][v.n][v.m] = false;v.level = f.level + 1;q.push(v);}}// s --> mif(f.s && m - f.m > 0) {if(f.s > m - f.m) { // s > m的剩余容量v.s = f.s - (m - f.m);v.n = f.n;v.m = m;} else { // s <= m的剩余容量v.s = 0;v.n = f.n;v.m = f.m + f.s;}if(notvist[v.s][v.n][v.m]) {notvist[v.s][v.n][v.m] = false;v.level = f.level + 1;q.push(v);}}// n --> sif(f.n && s - f.s > 0) {if(f.n > s - f.s) { // n > s的剩余容量v.s = s;v.n = f.n - (s - f.s);v.m = f.m;} else { // n <= s的剩余容量v.s = f.s + f.n;v.n = 0;v.m = f.m;}if(notvist[v.s][v.n][v.m]) {notvist[v.s][v.n][v.m] = false;v.level = f.level + 1;q.push(v);}}// n --> mif(f.n && m - f.m > 0) {if(f.n > m - f.m) { // n > m的剩余容量v.s = f.s;v.n = f.n - (m - f.m);v.m = m;} else { // n <= m的剩余容量v.s = f.s;v.n = 0;v.m = f.m + f.n;}if(notvist[v.s][v.n][v.m]) {notvist[v.s][v.n][v.m] = false;v.level = f.level + 1;q.push(v);}}// m --> sif(f.m && s - f.s > 0) {if(f.m > s - f.s) { // m > s的剩余容量v.s = s;v.n = f.n;v.m = f.m - (s - f.s);} else { // m <= s的剩余容量v.s = f.s + f.m;v.n = f.n;v.m = 0;}if(notvist[v.s][v.n][v.m]) {notvist[v.s][v.n][v.m] = false;v.level = f.level + 1;q.push(v);}}// m --> nif(f.m && n - f.n > 0) {if(f.m > n - f.n) { // m > n的剩余容量v.s = f.s;v.n = n;v.m = f.m - (n - f.n);} else { // m <= n的剩余容量v.s = f.s;v.n = f.n + f.m;v.m = 0;}if(notvist[v.s][v.n][v.m]) {notvist[v.s][v.n][v.m] = false;v.level = f.level + 1;q.push(v);}}}return -1; }int main() {while(scanf("%d%d%d", &s, &n, &m) != EOF) {if(s == 0 && n == 0 && m == 0)break;int ans = bfs();if(ans < 0)printf("NO\n");elseprintf("%d\n", ans);}return 0; }
參考鏈接:非??蓸?。



轉載于:https://www.cnblogs.com/tigerisland/p/7564390.html

總結

以上是生活随笔為你收集整理的HDU1495 非常可乐的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。