GameGame |
---|
题意: 两人进行游戏,轮流从给定序列中取数至序列为空,两人的最终分数为所取数的异或和。试判断该游戏为先手胜、后手胜还是平局。
题解: 最关键的在于分数的评定上,是所取数的异或值。那如果将所有的数转换成二进制,那结果就很明了,拿到奇数个最高位为1的数能够获胜(指的是在所有数中的最高的一位)。那判断先手能否胜利的条件就是从最高位往低位逐位判断:如果先手能够拿到奇数个最高位为1的数字(后手为偶数个拿到了偶数个),方能获胜;如果先手因为n为奇数拿到了偶数个最高位为1的数字(偶数个1异或得0,而后手拿到了奇数个),则必然失败;直到末位都没有出现过这两个情况,则平手。
#include<bits/stdc++.h>
using namespace std;
int maxn;
int vis[100];
void gao(int x) {
int cnt = 0;
while(x) {
if(x & 1) vis[cnt]++;
maxn = max(maxn, cnt++);
x /= 2;
}
}
void run() {
maxn = -1;
for(int i = 0; i < 100; i++) vis[i] = 0;
int n ; scanf("%d", &n);
for(int i = 0; i < n; i++) {
int x; scanf("%d", &x);
if(x) gao(x);
}
for(int i = maxn; i >= 0; i--) {
if(vis[i] % 4 == 1) {
printf("WIN\n");
return ;
} else if(vis[i] % 4 == 3) {
if(n & 1 ) printf("LOSE\n");
else printf("WIN\n");
return ;
}
}
printf("DRAW\n");
}
int main() {
int _T; scanf("%d", &_T);
while(_T--) run();
return 0;
}