nim博弈

原題連接 :https://www.acwing.com/problem/content/893/ios

 

給定nn堆石子,兩位玩家輪流操做,每次操做能夠從任意一堆石子中拿走任意數量的石子(能夠拿完,但不能不拿),最後沒法進行操做的人視爲失敗。nginx

問若是兩人都採用最優策略,先手是否必勝。ide

輸入格式

第一行包含整數nn。學習

第二行包含nn個數字,其中第 ii 個數字表示第 ii 堆石子的數量。atom

輸出格式

若是先手方必勝,則輸出「Yes」。spa

不然,輸出「No」。code

數據範圍

1n1051≤n≤105,
11091≤每堆石子數≤109
xml

輸入樣例:

2
2 3

輸出樣例:

Yes


nim 博弈,是簡單博弈也是我對博弈學習的開始

這類博弈能夠當作 兩種狀態 :
  1. 先手必勝:當全部值得異或值不等於零時,先手必定能夠通過某種操做變成零,後手又會把零變成非零,最後險收益指不是零,後手會遇到最後的零
  2. 先手必敗:反過來當全部值得異或值等於零時,先手都會使零變成非零,後手始終是將非零變成零,後手必勝

 

代碼:blog

 1 #include <iostream>
 2 #include <string>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cmath>
 6 
 7 using namespace std;
 8 
 9 int main()
10 {
11     int n;
12     cin >>n;
13     int res=0;
14     while(n--)
15     {
16         int x;
17         cin >> x;
18         res = res^x;
19     }
20     if(res)puts("Yes");
21     else puts("No");
22     return 0;
23 }
View Code
相關文章
相關標籤/搜索