Georgia and Bob(Poj 1704)Nim 博弈
Georgia and Bob
思路
每個棋子只能向左移動并且不能越過其左邊的棋子,這就有點(diǎn)像是經(jīng)典的nim博弈了,
但是在這里后一個石子會受到其前一個石子位置的影響,這里就需要轉(zhuǎn)化一下了。
我們假設(shè)只有兩個棋子,x,y,x>0,y>xx, y , x > 0, y > xx,y,x>0,y>x,顯然先手可以第一步移動后面的棋子,到與第一顆棋子臨近的地方,
然后無論后手如何移動棋子一,先手只要走與后手移動的步數(shù)相同,也就是保證了兩者一定相鄰,
這個時候假設(shè)一個結(jié)論,當(dāng)所有間隔異或起來為0的時候先手必輸,后手必勝,
我們再看一個例子1,3,51, 3, 51,3,5,間隔異或?yàn)?span id="ozvdkddzhkzd" class="katex--inline">000,所以先手輸了,但是事實(shí)并不是啊,
先手可以操縱5走到4,然后無論后手如何操作,先手都按照他的操作copy走。
所以我么先前的假設(shè)有問題,但是似乎我們能大概得到,最后操作最后面的棋子是總能是最優(yōu)的
但是最后面的棋子會受其前面的棋子的影響,因此我們從右向左給棋子兩兩分組,顯然如果移動左側(cè)的棋子我們可以移動右側(cè)的棋子,
使?fàn)顟B(tài)保持不變,移動左側(cè)的棋子就是他們中間的空位一直減小,當(dāng)沒一對棋子的空隙都為零時,顯然勝負(fù)狀態(tài)就已經(jīng)決定了,
所以這里就成功轉(zhuǎn)換為了一個nim博弈。
寫min_25寫廢了,水一水簡單博弈
代碼
/*Author : lifehappy */ #pragma GCC optimize(2) #pragma GCC optimize(3) #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <cstring> #include <vector> #include <stdlib.h> #include <map>using namespace std;typedef long long ll;const int inf = 0x3f3f3f3f; const double eps = 1e-6;const int N = 1e4 + 10;int a[N], n;int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int T;scanf("%d", &T);while(T--) {scanf("%d", &n);for(int i = 1; i <= n; i++) {scanf("%d", &a[i]);}sort(a + 1, a + 1 + n);int ans = 0;for(int i = n; i > 0; i -= 2) {ans ^= (a[i] - a[i - 1] - 1);}if(ans) puts("Georgia will win");else puts("Bob will win");}return 0; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Georgia and Bob(Poj 1704)Nim 博弈的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洛克王国宠物营救攻略
- 下一篇: 1847 奇怪的数学题(杜教筛 + Mi