博弈論 P1288 取數遊戲II

2022-04-16 22:16:15 字數 2187 閱讀 9067

傳送門

有乙個取數的遊戲。初始時,給出乙個環,環上的每條邊上都有乙個非負整數。這些整數中至少有乙個0。然後,將一枚硬幣放在環上的乙個節點上。兩個玩家就是以這個放硬幣的節點為起點開始這個遊戲,兩人輪流取數,取數的規則如下:

(1)選擇硬幣左邊或者右邊的一條邊,並且邊上的數非0;

(2)將這條邊上的數減至任意乙個非負整數(至少要有所減小);

(3)將硬幣移至邊的另一端。

如果輪到乙個玩家走,這時硬幣左右兩邊的邊上的數值都是0,那麼這個玩家就輸了。

如下圖,描述的是alice和bob兩人的對弈過程,其中黑色節點表示硬幣所在節點。結果圖(d)中,輪到bob走時,硬幣兩邊的邊上都是0,所以alcie獲勝。

現在,你的任務就是根據給出的環、邊上的數值以及起點(硬幣所在位置),判斷先走方是否有必勝的策略。

第一行乙個整數n(n≤20),表示環上的節點數。

第二行n個數,數值不超過30,依次表示n條邊上的數值。硬幣的起始位置在第一條邊與最後一條邊之間的節點上。

僅一行。若存在必勝策略,則輸出「yes」,否則輸出「no」。

425

30

yes

300

0

no
(n≤20)

博弈論。有如下性質:

定理一:先手決定取數的方向。

證明:如圖一:

(圖一)

從綠色點開始取數,不妨設先手想順時針方向取數,那麼只需要把權值為1的邊取成0即可。後手只能繼續順時針取數,因為不能取邊權0的一側。

一般的,先手只要將自己想要的方向取成0,那麼就可以決定自己取數的方向。

定理2:取數過程的方向是單向的,一旦確定不會折返。

證明:如圖一,依然不妨設先手想順指標取數,那麼他先取了邊權為1的邊,此時後手只能繼續順時針取數,不管他將2取成1還是0,先手如果想繼續順時針取數,那麼只需要繼續取邊權為3的邊為0即可,無需考慮後手上一步是怎麼取得。因為下一條邊取成0之後,無論如何都不會返回上一條邊了。

一般的,先手只要把自己經過的邊取成0,就可以保證過程單向不會折返。

由定理1、2易推知定理3:在取數過程中,每個人會取到哪個位置是唯一確定的。

由定理2可以推知定理4:在取數過程中,誰的「前進道路」的下一條邊是零邊誰就會輸。

證明:由定理2可知方向是單向的。如果前面是0邊,則無法往前走,由定理二也無法往後走(只需要上一手的人把上一條邊取成0)。於是會輸。

綜合定理1、2、3、4可以知道,只要出發點的取數方向一側的線段離0邊距離為偶數,則必勝,否則必輸。由於先手可以選擇順時針或逆時針,所以列舉兩個方向,如果有必勝策略則必勝。如果都會輸則gg。

#include#define maxn 25inline 

void qr(int &x)

while(ch>='

0'&&ch<='

9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar();

x*=f;

return;}

inline

int max(const

int &a,const

int &b)

inline

int min(const

int &a,const

int &b)

inline

int abs(const

int &x)

inline

void swap(int &a,int &b)

intn,mu[maxn];

intmain()

break

; }

}if(mu[n]) for(int i=n;i;--i)

break

; }

}putchar('n

');putchar('

o');putchar('\n'

);

return0;

}

P1288 取數遊戲II

luogu原題 最近剛學了博弈論,拿來練練手qwq 其實和數值的大小並沒有關係 我們用n p態來表示必勝 必敗狀態 先在草稿紙上 硬幣 在最左側 其實左右側是等價的 的一條長鏈的n p態,設鏈長為n 我們用1代替其他所有非0數 n 2 1 n態 n 3 11 p態 我們發現,當n為奇數時,則為p態,...

P1288 取數遊戲II

又是奇怪的博弈論 這道題有很多的結論啊,從題解乙個乙個抄過來 那個先手的想取哪邊,整局遊戲就能固定取哪邊。如果先手想要取某一條邊的方向,只需要暴力取光即可,因為後手沒辦法回去了。當第一條邊已經被取光的時候,每個人只可能一次把邊取光了。否則對手會反手把這條邊取光,你就輸了。一旦開始了這種暴力取邊的博弈...

洛谷 P1288 取數遊戲II

有乙個取數的遊戲。初始時,給出乙個環,環上的每條邊上都有乙個非負整數。這些整數中至少有乙個0。然後,將一枚硬幣放在環上的乙個節點上。兩個玩家就是以這個放硬幣的節點為起點開始這個遊戲,兩人輪流取數,取數的規則如下 1 選擇硬幣左邊或者右邊的一條邊,並且邊上的數非0 2 將這條邊上的數減至任意乙個非負整...