[BZOJ 3759]Hungergame
Nim游戏获胜的条件是所有石子的异或和为0
如果先手要获胜,那么一定是打开了一个异或和为0的极大子集
什么是极大子集呢?
就是无论后手打开任何子集的箱子,都不能再使此时打开的箱子异或和为0.
容易证明这样做是对的。
#include <bits/stdc++.h> #define maxn 100 using namespace std; int a[maxn], n, base[maxn]; bool Gauss(){ memset(base, 0, sizeof base); for(int i = 1; i <= n; i ++){ for(int j = 30; j >= 0; j --) if(a[i] >> j & 1){ if(!base[j]){base[j] = a[i]; break;} else a[i] ^= base[j]; } if(!a[i])return 1; }return 0; } int main(){ int test; //scanf("%d", &test); test = 10; while(test --){ scanf("%d", &n); for(int i = 1; i <= n; i ++) scanf("%d", &a[i]); if(!Gauss())puts("YES"); else puts("NO"); } return 0; }
[BZOJ 1299]巧克力棒
愣是没看出来是一道题。。
给时光以生命,而不是给生命以时光。