《雲頂之弈》11.17版本強勢陣容排行
阿新 • • 發佈:2021-09-01
博弈論基礎介紹:
巴什博弈:
例子:
一堆石子 \(n\) 個,任意取 \([1-m]\) 個,問先手必贏/輸。
分析:
分類進行考慮:
- \([1,m]\) 個,先手必贏。
- \(m+1\) 個,先手必輸。
- \([m+2,2m]\) 先手可以拿走幾個,剩下 \(m+1\) 個,先手必勝。
我們發現,面臨 \(m+1\) 個石子的人一定失敗。
進行推廣:設當前石子數為 \(n=k*(m+1)+r\), 先手先拿走 \(r\) 個,無論後手怎麼拿 \(x\) 個,先手一定可以拿走 \(m+1-x\) 個,這樣後手一定失敗。
反之,當 \((m+1)|n\) ,先手一定失敗。
因此,只要不滿足 \((m+1)|n\)
\(nim\) 遊戲
例子:
有 \(n\) 堆石子,兩個人可以從任意一堆石子中拿任意多個石子(不能不拿),沒法拿的人失敗。問誰會勝利。
定理:
當 \(n\) 堆石子的數量異或和等於 \(0\) 時,先手必敗,否則先手必勝.
證明:
必敗狀態:我們設 \(a[i]\) 表示 \(i\) 堆石子的數量。當前局面為:
\[0⊕0⊕0⊕⋯⊕0=0 \]對於先手來說,如果當前局面為:
\[a_1⊕a_2⊕a_3⊕⋯⊕a_n=k \]那麼一定存在 \(a_i\) ,二進位制表示在最高位 \(k\) 上為 \(1\)。
我們將 \(a_i⊕k\) ,這樣就變成了:
\[a_1⊕a_2⊕a_3⊕⋯⊕a_n⊕k=0 \]我們只需要保證給後手的人所有石子異或值為0,即可獲勝,此時先手必勝。
反之,一開始異或值為 \(0\) ,此時先手必敗。
特殊情況:
有些題目,只能選擇 \([1-m]\) 個石子,這就是 \(nim+bash\) ,只需要將所有的石子堆的石子數目同時模 \(m+1\),然後異或運算即可。
for(int i=1;i<=N;i++) scanf("%d",&a[i]);
for(int i=1;i<=N;i++) ans=ans^a[i];
ans==0?printf("No\n"):printf("Yes\n");