原題連接 :https://www.acwing.com/problem/content/893/ios
給定nn堆石子,兩位玩家輪流操做,每次操做能夠從任意一堆石子中拿走任意數量的石子(能夠拿完,但不能不拿),最後沒法進行操做的人視爲失敗。nginx
問若是兩人都採用最優策略,先手是否必勝。ide
第一行包含整數nn。學習
第二行包含nn個數字,其中第 ii 個數字表示第 ii 堆石子的數量。atom
若是先手方必勝,則輸出「Yes」。spa
不然,輸出「No」。code
1≤n≤1051≤n≤105,
1≤每堆石子數≤1091≤每堆石子數≤109xml
2 2 3
Yes
nim 博弈,是簡單博弈也是我對博弈學習的開始
這類博弈能夠當作 兩種狀態 :
先手必敗:反過來當全部值得異或值等於零時,先手都會使零變成非零,後手始終是將非零變成零,後手必勝
代碼: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 }