Georgia and Bob(Poj 1704)Nim 博弈
生活随笔
收集整理的這篇文章主要介紹了
Georgia and Bob(Poj 1704)Nim 博弈
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Georgia and Bob
思路
每個棋子只能向左移動并且不能越過其左邊的棋子,這就有點像是經典的nim博弈了,
但是在這里后一個石子會受到其前一個石子位置的影響,這里就需要轉化一下了。
我們假設只有兩個棋子,x,y,x>0,y>xx, y , x > 0, y > xx,y,x>0,y>x,顯然先手可以第一步移動后面的棋子,到與第一顆棋子臨近的地方,
然后無論后手如何移動棋子一,先手只要走與后手移動的步數相同,也就是保證了兩者一定相鄰,
這個時候假設一個結論,當所有間隔異或起來為0的時候先手必輸,后手必勝,
我們再看一個例子1,3,51, 3, 51,3,5,間隔異或為000,所以先手輸了,但是事實并不是啊,
先手可以操縱5走到4,然后無論后手如何操作,先手都按照他的操作copy走。
所以我么先前的假設有問題,但是似乎我們能大概得到,最后操作最后面的棋子是總能是最優的
但是最后面的棋子會受其前面的棋子的影響,因此我們從右向左給棋子兩兩分組,顯然如果移動左側的棋子我們可以移動右側的棋子,
使狀態保持不變,移動左側的棋子就是他們中間的空位一直減小,當沒一對棋子的空隙都為零時,顯然勝負狀態就已經決定了,
所以這里就成功轉換為了一個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; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Georgia and Bob(Poj 1704)Nim 博弈的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洛克王国宠物营救攻略
- 下一篇: 免费强悍杀毒软件——大蜘蛛绿色版