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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【codeforces 787C】Berzerk

發布時間:2023/12/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【codeforces 787C】Berzerk 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【題目鏈接】:http://codeforces.com/contest/787/problem/C

【題意】

給你怪物一開始所在的位置;
然后兩人輪流操作;
可以選擇讓這個怪物前進自己的集合里面所擁有的數字所代表的步數;
對于2..n這些怪物的起點以及誰先進行游戲這些信息;
讓這個怪物到位置1的人贏
判斷誰能贏,輸,或者游戲一直循環下去

【題解】

設f[i][j]表示i先玩,然后怪物一開始的位置為j的結果;

//-2表示輸,-1表示贏,0表示不確定
f[1][1]=f[2][1]=-2;
即如果誰面臨了怪物到達了1這個位置這個狀態,他就輸了;
因為這表示對方已經完成游戲了;
這樣就代表先手輸了;
然后對于這些為-2的狀態;
可以往前推前一個人的狀態;

前一個人,他走一步(通過自己集合里面的步數)到達了-2的狀態;
也就是說讓對方面臨了先手輸的狀態,本來你是先手,然后你走一步,對方就變成先手啦,那么對方面臨了先手輸的狀態,那么你就贏了;
因此對于所有能夠走到-2的狀態;
置其狀態為先手贏;
然后再去找那些;
無論用集合里面哪個元素走,都會讓對方面臨先手贏狀態的狀態;
這些狀態,置它們為先手輸;
因為它們無論怎么走,對方都能面對先手贏的狀態;
然后對于其他的狀態,都是不確定.
寫個倒推就好;
具體看代碼

【完整代碼】

#include <bits/stdc++.h> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define LL long long #define rep1(i,a,b) for (int i = a;i <= b;i++) #define rep2(i,a,b) for (int i = a;i >= b;i--) #define mp make_pair #define pb push_back #define fi first #define se second #define rei(x) scanf("%d",&x) #define rel(x) scanf("%lld",&x) #define ref(x) scanf("%lf",&x)typedef pair<int,int> pii; typedef pair<LL,LL> pll;const int dx[9] = {0,1,-1,0,0,-1,-1,1,1}; const int dy[9] = {0,0,0,-1,1,-1,1,-1,1}; const double pi = acos(-1.0); const int N = 7e3+100;int k[3],n; int s[3][N]; int g[3][N]; queue <pii> dl;void in() {rei(n);rep1(i,1,2){rei(k[i]);rep1(j,1,k[i])rei(s[i][j]);} }void get_ans() {dl.push(mp(1,1)),dl.push(mp(2,1));g[1][1] = -2,g[2][1] = -2;while (!dl.empty()){int f = dl.front().fi,x = dl.front().se;int nex = 3-f;dl.pop();rep1(i,1,k[nex]){int y = x-s[nex][i];if (y<=0)y+=n;if (g[f][x]==-2){if (g[nex][y]!=-1){g[nex][y] = -1;dl.push(mp(nex,y));}}else{//g[f][x] = -1if (g[nex][y]<0) continue;//如果已經確定了,就不用計數了g[nex][y]++;//用來記錄這個狀態用集合里面的元素走一步會遇到多少個先手贏的狀態,這里是直接在這個數組上計數,一數組兩用if (g[nex][y]==k[nex])//如果全都是先手贏,那么這個狀態就是先手輸{g[nex][y] = -2;dl.push(mp(nex,y));}}}} }void o() {rep1(i,2,n){if (g[1][i]==-2)printf("Lose");elseif (g[1][i]==-1)printf("Win");elseprintf("Loop");if (i==n)puts("");elseputchar(' ');}rep1(i,2,n){if (g[2][i]==-2)printf("Lose");elseif (g[2][i]==-1)printf("Win");elseprintf("Loop");if (i==n)puts("");elseputchar(' ');} }int main() {//freopen("F:\\rush.txt","r",stdin);in();get_ans();o();//printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);return 0; }

轉載于:https://www.cnblogs.com/AWCXV/p/7626533.html

總結

以上是生活随笔為你收集整理的【codeforces 787C】Berzerk的全部內容,希望文章能夠幫你解決所遇到的問題。

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