傳送門
有乙個取數的遊戲。初始時,給出乙個環,環上的每條邊上都有乙個非負整數。這些整數中至少有乙個0。然後,將一枚硬幣放在環上的乙個節點上。兩個玩家就是以這個放硬幣的節點為起點開始這個遊戲,兩人輪流取數,取數的規則如下:
(1)選擇硬幣左邊或者右邊的一條邊,並且邊上的數非0;
(2)將這條邊上的數減至任意乙個非負整數(至少要有所減小);
(3)將硬幣移至邊的另一端。
如果輪到乙個玩家走,這時硬幣左右兩邊的邊上的數值都是0,那麼這個玩家就輸了。
如下圖,描述的是alice和bob兩人的對弈過程,其中黑色節點表示硬幣所在節點。結果圖(d)中,輪到bob走時,硬幣兩邊的邊上都是0,所以alcie獲勝。
現在,你的任務就是根據給出的環、邊上的數值以及起點(硬幣所在位置),判斷先走方是否有必勝的策略。
第一行乙個整數n(n≤20),表示環上的節點數。
第二行n個數,數值不超過30,依次表示n條邊上的數值。硬幣的起始位置在第一條邊與最後一條邊之間的節點上。
僅一行。若存在必勝策略,則輸出「yes」,否則輸出「no」。
42530
yes
3000
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 25inlinevoid 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 將這條邊上的數減至任意乙個非負整...