1. 程式人生 > >博弈(三) 尼姆博弈(Nimm Game)

博弈(三) 尼姆博弈(Nimm Game)

尼姆博弈(Nimm Game)

有3堆任意多的物品(x, y, z)。兩個人輪流拿,每次只能從一堆中拿,至少拿一個,至多不限。拿到最後者勝利。
結論:
必敗點為 x^y^z = 0。(^為異或)
證明:
如果當前局勢為(0,0,0)。先手肯定輸。其中0^0^0=0
如果當前局勢為(0,n,n)。先手肯定輸。因為無論先手怎麼拿,後手都可以從另一堆裡拿相同多個。最終轉化成(0,0,0)的情況。其中0^n^n=0
如果當前局勢為(1,2,3)。先手肯定輸。無論先手怎麼拿,後手都可以將局勢轉為(0,n,n)的情況。其中1^2^3=0
以(1,2,3)為例:

10進位制 二進位制
1 01
2 10
3 11

當前為奇異局勢當且僅當二進位制的各位的和為偶數,稱達到平衡態,達到平衡態的每一位稱位平衡位。無論先手怎麼拿,後手都可以通過一步操作將局勢轉為新的平衡態。所以x^y^z=0為奇異局勢。先手必輸。
將非奇異局勢轉化為奇異局勢只需將z變成x^y即可。因為x^y^z = x^y^(x^y) = (x^x)^(y^y) = 0^0 = 0
任意堆的推廣:
1堆的時候先手贏。x != 0
2堆的時候取決於兩堆的數目是否相等,相等的話x^y=0,後手贏,不相等x^y!=0,先手贏
推廣到任意多堆的情況(x1, x2, x3··· ···xn)
例如當n=4的時候,各堆大小分別是8,12,14,16

十進位制 二進位制
8 01000
12 01100
14 01110
16 10000

先手可以從16的堆裡拿走6個使之成為平衡態

十進位制 二進位制
8 01000
12 01100
14 01110
10 01010

之後無論後手怎麼拿,先手都可以使之重新成為平衡態。所以最後先手一定勝利。
遞推關係的驗證:
1.每一個n狀態(必勝態)都可以通過一步轉為p狀態(必敗態)
例如當前異或和X為1000101,總可以尋找到一個堆Y與X最高位的同位為1,例如Y=1001110,Z = X^Y=0001011,Z肯定小於Y,則可以將Y堆拿出(Y-Z)個物品,使得異或和為0達到平衡態。
設沒操作之前的異或和為X,當前堆為Y,其他堆異或和為Z,即Z^Y=X,然後將當前堆改為Y^X。則操作之後的異或和等於Z^Y^X=X^X=0(p狀態)
2.每個p狀態不可能通過一步操作轉為p狀態
p狀態異或和為0,如果只對一堆操作,無論拿多少個異或和都不可能為全0。
所以對於任意多堆時結論仍然成立。
例題:


HDU - 1850
程式碼:

#include<bits/stdc++.h>

using namespace std;
const int maxn = 100 + 5;
int a[maxn];
int n;

int main() {
    while(cin >> n, n) {
        int ans = 0;
        for(int i = 0; i < n; i++) {
            cin >> a[i];
            ans ^= a[i];
        }
        int cnt = 0;
        for(int i = 0; i < n; i++) {
            if(a[i] > (a[i]^ans)) cnt++;
        }
        cout << cnt << endl;
    }
    return 0;
}

相關推薦

博弈() 博弈(Nimm Game)

尼姆博弈(Nimm Game) 有3堆任意多的物品(x, y, z)。兩個人輪流拿,每次只能從一堆中拿,至少拿一個,至多不限。拿到最後者勝利。 結論: 必敗點為 x^y^z = 0。(^為異或) 證明: 如果當前局勢為(0,0,0)。先手肯定輸。其中0

ICG博弈_博弈(Nim Game)及證明

這是最後一篇ICG博弈,尼姆博弈,對比前面的巴什博弈和威佐夫博弈,尼姆博弈的玩法更加自由化,因此想贏的過程也更加複雜。   如果沒有了解過巴什博弈和威佐夫博弈的,建議先看上兩篇 :巴什博弈及證明   威佐夫博弈及證明 尼姆博弈(Nimm Game)

博弈論(巴什博奕,威佐夫博弈博弈,斐波那契博弈

一.  巴什博奕(Bash Game):   A和B一塊報數,每人每次報最少1個,最多報4個,看誰先報到30。這應該是最古老的關於巴什博奕的遊戲了吧。 其實如果知道原理,這遊戲一點運氣成分都沒有,只和先手後手有關,比如第一次報數,A報k個數,那麼B報5-k個數,那麼B報數之

博弈Nimm Game

尼姆博弈(Nimm Game) 尼姆博弈指的是這樣一個博弈遊戲:有任意堆物品,每堆物品的個數是任意的,雙方輪流從中取物品,每一次只能從一堆物品中取部分或全部物品,最少取一件,取到最後一件物品的人獲勝。 結論就是:把每堆物品數全部異或起來,如果得到的值為0,那麼先手必敗,否則先手必勝。

POJ2234 Matches Game 博弈 博弈論

none dbf hide 一個 lan while splay ont href http://poj.org/problem?id=2234 尼姆博弈(Nimm‘s Game) 指的是這樣一個博弈遊戲:有任意堆物品,每堆物品的個數是任意的,雙方輪流從中取物品,每一次只能

“浪潮杯”第九屆山東省ACM大學生程式設計競賽重現賽 G game博弈

題目描述 Alice and Bob are playing a stone game. There are n piles of stones. In each turn, a player can remove some stones from a pile (th

Being a Good Boy in Spring Festival(杭電1850)(博弈

cor gree 強烈 方案 con tracking output script 主動 Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others) Memory Limi

hdoj 1850 Being a Good Boy in Spring Festival(博弈)

-s 爸爸 clu 小遊戲 spring 我們 結束 否則 scrip Problem Description 一年在外 父母時刻牽掛春節回家 你能做幾天好孩子嗎寒假裏嘗試做做下面的事情吧陪媽媽逛一次菜場悄悄給爸爸買個小禮物主動地 強烈地 要求洗一次碗某一天早起 給爸媽

John 博弈

least air exti there with 經典的 args determine nes John Little John is playing very funny game with his younger brother. There is one big

POJ2975 Nim 博弈論 博弈

gif pen 分享圖片 can play include -c org one http://poj.org/problem?id=2975 題目始終是ac的最大阻礙。 問只取一堆有多少方案可以使當前局面為先手必敗。 顯然由尼姆博弈的性質可以知道需要取石子使所有堆石子

【USTC 1213】取石子遊戲(博弈

std col 遊戲 script pro 取石子 div ++ pre Description 在組合博弈論中,Nim遊戲是一個非常經典的問題,Nim遊戲可描述如下:有n堆石子,每堆石子數分別為a1, a2, …, an (ai≥0)。現有兩人輪流從這n堆中取石子,每

題解報告:hdu 1850 Being a Good Boy in Spring Festival(博弈

轉化 主動 輸入 content hdu () scrip tput inpu 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1850 Problem Description 一年在外 父母時刻牽掛春節回家 你能做幾天好孩子嗎

Nim遊戲(博弈

這裡是尼姆博弈的模板,前面的博弈問題的部落格裡也有,這裡單列出來。 有N堆石子。A B兩個人輪流拿,A先拿。每次只能從一堆中取若干個,可將一堆全取走,但不可不取,拿到最後1顆石子的人獲勝。假設A B都非常聰明,拿石子的過程中不會出現失誤。給出N及每堆石子的數量,問最後誰能贏得比賽。

HDU 1907:John(博弈變形)

John Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submi

43 博弈和威佐夫博弈的關係

昨晚上一道博弈題讓我又理解了一下博弈,趕緊掏出我的小本子; 1 尼姆博弈我們都是知道的如果是每一個狀態的sg值異或完後如果是非零先手必有勝的策略否則沒有, 這裡再說一下是為什麼我們可以這麼想,我們就是要判斷先手是否是能先把石子取完: 博弈實際上是平衡問題,如果是當前狀態

博弈論知識點總結(巴什博奕 威佐夫博弈 博弈 SG()函式介紹)

總結 真心感謝博主,終於知道為什麼尼姆博弈用異或來解決。 SG函式模板: void init()//根據題目要求進行修改 { a[0]=1; for(int i=1;i<=32;i

階梯博弈演算法詳解(博弈進階)

1.什麼是階梯博弈? 階梯的序號如圖所示,地面表示第0號階梯。每次都可以將一個階梯上的石子向其左側移動任意個石子,沒有可以移動的空間時(及所有石子都位於地面時)輸。 2.階梯博弈的演算法 階梯博弈等效

hdu 1850 Being a Good Boy in Spring Festival(博弈)

Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem

博弈

尼姆博奕(Nimm Game):有三堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取一個,多者不限,最後取光者得勝。 這種情況最有意思,它與二進位制有密切關係,我們用(a,b,c)表示某種局勢,首先(0,0,0)顯然是奇異局勢,無論誰面對奇異局勢,都必然

ACM-博弈之取(m堆)石子游戲——hdu2176

取(m堆)石子游戲 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1486    Accepted Sub