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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Codeforces 786ABerzerk(博弈)

發布時間:2023/12/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces 786ABerzerk(博弈) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接

很明顯的博弈題目,但是昨天打比賽的時候就是一直想不出來,一直在糾結這個loop的情況到底要怎么定義,感覺到深深的挫敗感,自己之前專門看了一段時間博弈也沒有任何用處= =太菜了

今天看了一下題解,發現思路其實還是很簡單的,對于每個點都有兩種狀態,a推到這里和b推到這里,我們可以知道,對于1這個位置,無論哪個人在面臨這樣的局面時,都是必敗態,我們從這個點出發,如果這個點是必敗態(0),那么對于所有能一步走到這個點的位置,都有必勝態;對于每個狀態,只有當它的后續狀態都為1時,這個點為必敗態,所以我們可以從1出發,對于每個能走到這個點的狀態本身進行一個數量的統計,如果這個num=它的可操作步數,就說明這個點為必敗態。

我們可以通過bfs來解決。

#include <bits/stdc++.h> using namespace std; const double eps = 1e-6; const double pi = acos(-1.0); const int INF = 0x3f3f3f3f; const int MOD = 1000000007; #define ll long long #define CL(a) memset(a,0,sizeof(a)) #define maxn 7010 #define mod 2520 int dp[2][maxn],num[2][maxn]; int n; vector<int> v[2];void bfs() {queue<pair<int,int> > que;que.push(make_pair(0,0));que.push(make_pair(1,0));while(!que.empty()){int p=que.front().first;int pos=que.front().second;int x=dp[p][pos];que.pop();if(x==0){for(int i=0; i<v[!p].size(); i++){int nxt=(pos-v[!p][i]+n)%n;if(dp[!p][nxt]==-1){dp[!p][nxt]=1;que.push(make_pair(!p,nxt));}}}else{for(int i=0; i<v[!p].size(); i++){int nxt=(pos-v[!p][i]+n)%n;if(dp[!p][nxt]!=-1) continue;if(num[!p][nxt]<v[!p].size()) num[!p][nxt]++;if(num[!p][nxt]==v[!p].size()){dp[!p][nxt]=0;que.push(make_pair(!p,nxt));}}}}}int main () {memset(dp,-1,sizeof(dp));memset(num,0,sizeof(num));cin>>n;for(int i=0; i<2; i++){int k;cin>>k;for(int j=0; j<k; j++){int m;cin>>m;v[i].push_back(m);}}dp[0][0]=dp[1][0]=0;bfs();for(int i=0; i<2; i++){for(int j=1; j<n; j++){if(dp[i][j]==0) cout<<"Lose"<<' ';else if(dp[i][j]==1) cout<<"Win"<<' ';else cout<<"Loop"<<' ';}cout<<endl;}return 0; }

總結

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

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