給定n堆石子以及乙個由k個不同正整數構成的數字集合s。
現在有兩位玩家輪流操作,每次操作可以從任意一堆石子中拿取石子,每次拿取的石子數量必須包含於集合s,最後無法進行操作的人視為失敗。
問如果兩人都採用最優策略,先手是否必勝。
輸入格式
第一行包含整數k,表示數字集合s中數字的個數。
第二行包含k個整數,其中第i個整數表示數字集合s中的第i個數si。
第三行包含整數n。
第四行包含n個整數,其中第i個整數表示第i堆石子的數量hi。
輸出格式
如果先手方必勝,則輸出「yes」。
否則,輸出「no」。
資料範圍
1≤n,k≤1001≤n,k≤100,
1≤si,hi≤10000
輸入樣例:
2輸出案例2 53
2 4 7
yesnim遊戲
首先需要滿足固定條件
1,由兩名玩家交替行動
2,在遊戲程序的任意時刻,可以執行的合法行動與輪到哪名玩家無關
3,不行行動的玩家判負
此時稱該遊戲為乙個公平組合遊戲
nim博弈屬於公平組合遊戲,但城建的棋類遊戲,比如圍棋就不是公平組合遊戲。
⊕為異或符號
首先分三種請況
1:所有堆中均無棋子即所有堆中全為0
此時 0⊕0⊕0……⊕0=0
2:在初始狀態各個堆中均有不同的數,且此時在該狀態下有先手必勝
此時a1⊕a2⊕a3⊕……⊕an=x≠0
x的二進位制表示1中最高的一位1在第a1~an中必然存在乙個ai
ai的第k為是1
假設當ai的二進位制為 11001001101
x的二進位制為 1010010
ai⊕x 為 11000,
由此可知ai⊕x3:在初始狀態各個堆中均有不同的數,且此時在該狀態下有先手必敗
此時a1⊕a2⊕a3⊕……⊕an=0
又有a1⊕a2⊕a3⊕…ai』⊕a(i+1)⊕…⊕an=0
此時兩式不相同的僅ai與ai』
因此可得
ai⊕ai』=0
因此ai=ai』
即如若拿取任意乙個堆中的物品都會出現存在先手必勝的情況
由此可推,當初始狀態不滿住全為0時
如若初始存在先手必勝,當先手的玩家選取後,後手的玩家則存在先手必敗的情況
如若初始存在先手必敗,當先手的玩家選取後,後手的玩家則存在先手必勝的情況
因此我們僅需求出初始狀態下的存在的先手必敗或者先手必勝的狀態即可。
在題目中,有n堆石子,同時有乙個集合s,玩家操作取出某個堆中的石子的數量必須與集合s中的某乙個元素的量相同。因此對於乙個請況存在以集合s中的元素數為劃分的變化情況。
由此我們可以使用sg函式的方式來計算
在有向圖遊戲中,對於每個節點x,設從x出發共有k條有向邊,分別到達節點y1, y2, …, yk,定義sg(x)為x的後繼節點y1, y2, …, yk 的sg函式值構成的集合再執行mex(s)運算的結果,即:
sg(x) = mex()
特別地,整個有向圖遊戲g的sg函式值被定義為有向圖遊戲起點s的sg函式值,即sg(g) = sg(s)。
mex運算
設s表示乙個非負整數集合。定義mex(s)為求出不屬於集合s的最小非負整數的運算,即:
mex(s) = min, x屬於自然數,且x不屬於s
按照sg函式的定義
我們模擬如下圖
初始狀態如下圖我們設定點6與點7的值為0
由sg函式的結果可知,點4可到0,那麼到0前的最小值為1故點4的值為1,同理點5也為1 如下圖
然後點3可到1與0,那麼根據sg函式,點3取除能到的數以外的最小值,則點3為2 如下圖
然後點2可到1,那麼根據sg函式,點2取除能到的數以外的最小值,則點2為0 如下圖
然後點1可到0,1,2,那麼根據sg函式,點1取除能到的數以外的最小值,則點1為3 如下圖
這是在處理該型別題目時的某一種情況後的sg函式的結果。
對於該題可能存在多種上述的不同的有向圖,即多個sg函式的值。
由於在該題中我們每一堆石子均可操作,且有集合s內元素的情況。因此我們可以得到每一堆地sg值而後對每一堆地sg值進行異或計算。結果為0則先手必敗,否則為先手必勝。
使用異或的結果來判斷的原因參考經典nim遊戲的結論·。
#include
#include
#include
#include
using
namespace std;
const
int n=
110,m=
10010
;int s[n]
,f[m]
,k,n;
intsg
(int t)
for(
int i=0;
;i++)if
(!map.
count
(i))
return f[t]
=i;}
intmain()
ans?cout<<
"yes"
:cout<<
"no"
;return0;
}
博弈論 集合 Nim遊戲
mex運算 設s表示乙個非負整數集合。定義mex s 為求出不屬於集合s的最小非負整數的運算,即 找到集合當中不存在的最小自然數。mex s min,x屬於自然數,且x不屬於s sg函式 在有向圖遊戲中,對於每個節點x,設從x出發共有k條有向邊,分別到達節點y1,y2,yk,定義sg x 為x的後繼...
AcWing 893 集合 Nim遊戲
題目描述 給定n堆石子以及乙個由k個不同正整數構成的數字集合s。現在有兩位玩家輪流操作,每次操作可以從任意一堆石子中拿取石子,每次拿取的石子數量必須包含於集合s,最後無法進行操作的人視為失敗。問如果兩人都採用最優策略,先手是否必勝。輸入格式 第一行包含整數k,表示數字集合s中數字的個數。第二行包含k...
nim遊戲簡介
定義p position和n position,其中p代表previous,n代表next。直觀的說,上一次move的人有必勝策略的局面是p position,也就是 後手可保證必勝 或者 先手必敗 現在輪到move的人有必勝策略的局面是n position,也就是 先手可保證必勝 更嚴謹的定義是 ...