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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

UVa 1609 (博弈) Foul Play

發布時間:2024/4/17 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UVa 1609 (博弈) Foul Play 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

姑且把它歸類為一道博弈吧,畢竟這也是在找必勝方案。

十分有意思的一道題目,設計一種方案讓你支持的1隊獲勝。

題目給出了兩個很重要的條件:

  • 1隊能打敗至少一半的隊伍
  • 對于1隊不能打敗的黑隊,一定存在一個1隊能打敗的灰隊,使得這支灰隊能夠打敗黑隊。也就是說1隊可以通過灰隊間接打敗黑隊

一共有2n支隊伍,每輪比賽會刷掉一半的隊伍,紫書上巧妙的做法就是每輪比賽后讓題目給的兩個性質依然成立,這樣1隊最終一定能勝出。

方案如下,大致分為3個階段:

  • 物盡其用。依次考慮每個黑隊,如果有能夠打敗他的灰隊的話,便讓這兩只隊伍進行比賽。當然,灰隊會晉級下一輪。如果沒有能夠打敗當前黑隊而且還沒有進行比賽的灰隊,那么這支黑隊進入后面的混戰。
  • 讓1隊勝出。在1隊能夠打敗的隊伍中找到一支還未進行比賽的隊伍。對于其他未匹配的隊伍,也進入下一步的混戰。
  • 自由混戰。黑隊和黑隊混戰,這樣能保證至少消滅一半的黑隊,頂多有一個黑隊剩下。然后剩下的隊伍繼續混戰。
  • 至于為什么這樣一定會成功,還請參考紫書。

    1 #include <cstdio> 2 #include <vector> 3 using namespace std; 4 5 const int maxn = 1030; 6 7 char table[maxn][maxn]; 8 9 int main() 10 { 11 //freopen("in.txt", "r", stdin); 12 13 int n; 14 while(scanf("%d", &n) == 1 && n) 15 { 16 for(int i = 1; i <= n; i++) scanf("%s", table[i] + 1); 17 vector<int> win, lose; 18 for(int i = 2; i <= n; i++) 19 { 20 if(table[1][i] == '1') win.push_back(i); 21 else lose.push_back(i); 22 } 23 24 int T = n; 25 while(T >>= 1) 26 { 27 vector<int> win2, lose2, final;//進入下一輪1能打敗和被打敗,以及這一輪混戰的隊伍 28 bool match; 29 //階段1:盡可能多的用灰隊消滅黑隊 30 for(int i = 0; i < lose.size(); i++) 31 { 32 int black = lose[i]; 33 match = false; 34 for(int j = 0; j < win.size(); j++) 35 { 36 int& gray = win[j]; 37 if(gray > 0 && table[gray][black] == '1') 38 { 39 printf("%d %d\n", black, gray); 40 match = true; 41 win2.push_back(gray);//灰隊進入下一輪 42 gray = 0; 43 break; 44 } 45 } 46 if(!match) final.push_back(black);//進入后面的混戰 47 } 48 //階段2:給1隊找個對手 49 match = false; 50 for(int i = 0; i < win.size(); i++) 51 { 52 int team = win[i]; 53 if(team > 0) 54 { 55 if(!match) { printf("1 %d\n", team); match = true; } 56 else final.push_back(team);//1已經匹配到對手,該隊進入混戰 57 } 58 } 59 //階段3:自由混戰,注意到黑隊在final中都是挨在一起的 60 for(int i = 0; i < final.size(); i += 2) 61 { 62 printf("%d %d\n", final[i], final[i + 1]); 63 int survive = final[i]; 64 if(table[final[i + 1]][final[i]] == '1') survive = final[i + 1]; 65 if(table[1][survive] == '1') win2.push_back(survive); 66 else lose2.push_back(survive); 67 } 68 win = win2; 69 lose = lose2; 70 /*for(int i = 0; i < win.size(); i++) printf("%d ", win[i]); 71 puts(""); 72 for(int i = 0; i < lose.size(); i++) printf("%d ", lose[i]);*/ 73 } 74 } 75 76 return 0; 77 } 代碼君

    ?

    轉載于:https://www.cnblogs.com/AOQNRMGYXLMV/p/4443947.html

    總結

    以上是生活随笔為你收集整理的UVa 1609 (博弈) Foul Play的全部內容,希望文章能夠幫你解決所遇到的問題。

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