怎么又是博弈论。。。我去
Orz hzwer,这道题其实是可以转化成Nim游戏的!
"第一步:
先从n根巧克力棒中取出m(m>0)根,使得这m根巧克力棒的xor和为0,同时使得剩下的n-m根巧克力棒无论怎么取,xor和都不为0。
m根巧克力棒的xor和为0 <=>把nim游戏的必败状态留给对方
剩下的n-m根巧克力棒无论怎么取,xor和都不为0 <=> m为巧克力棒的xor和为0的最长子序列
第二步:
第一步以后,对手就面临一个必败状态的nim游戏。
如果他从n-m根中取新的巧克力棒,实际上就是新建一个xor和不为0的nim游戏,这时轮到己方操作只要将这个新的nim游戏取到xor和为0即可。
也就是让对方再次面临所有nim游戏均为必败状态的局面。"
于是只要寻找m是否存在即可,由于n = 14,深搜即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /************************************************************** 2 Problem: 1299 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:8 ms 7 Memory:804 kb 8 ****************************************************************/ 9 10 #include <cstdio> 11 12 using namespace std; 13 int n, a[20]; 14 bool flag; 15 16 inline int read(){ 17 int x = 0, sgn = 1; 18 char ch = getchar(); 19 while (ch < '0' || ch > '9'){ 20 if (ch == '-') sgn = -1; 21 ch = getchar(); 22 } 23 while (ch >= '0' && ch <= '9'){ 24 x = x * 10 + ch - '0'; 25 ch = getchar(); 26 } 27 return sgn * x; 28 } 29 30 void dfs(int x, int cnt, int X){ 31 if (x == n + 1){ 32 if (!X && cnt) flag = 1; 33 return; 34 } 35 if (flag) return; 36 dfs(x + 1, cnt, X); 37 if (flag) return; 38 dfs(x + 1, cnt + 1, X ^ a[x]); 39 } 40 41 int main(){ 42 for (int t = 1; t <= 10; ++t){ 43 flag = 0; 44 n = read(); 45 for (int i = 1; i <= n; ++i) 46 a[i] = read(); 47 dfs(1, 0, 0); 48 printf(flag ? "NO\n" : "YES\n"); 49 } 50 return 0; 51 }
By Xs酱~ 转载请说明
博客地址:http://www.cnblogs.com/rausen