这是题目:
大大大胃王比拼已经进入最后的冠亚军争夺战,你和张师傅是仅剩的两位选手。最后比拼的规则如下:共有n种口味的汉堡,其中第i种口味的汉堡初始量为a[i]个。两人轮流操作,每个人的操作可以是吃汉堡,或者是分汉堡。
吃汉堡:可以在剩下汉堡里,选择任意一种口味的汉堡,吃掉任意多个。
分汉堡:可以在剩下汉堡里,选择一种口味的所有汉堡,个数必须不少于2个。将这种汉堡分成两堆,每堆个数都不少于1个。每堆加一种新调料,从而产生新的两种汉堡。
若哪个人无法操作了,就输了。现在轮到你是第一个操作了,请问你有没有必胜策略?
输入输出格式
输入格式
输入文件stomach.in 每个输入文件里共有T组测试数据,第一行输入正整数T,T<=10。接着共有T组数据,每组数据第一个数为正整数n,代表初始汉堡种类,n<=10000。随后一行为n个正整数代表每种的初始数量,均不超过2^31-1。
输出格式
输出文件stomach.out 共输出T行,每一行为WIN或者LOSE代表是否有必胜策略。
输入输出样例
输入样例#1:
2
3
1 2 3
2
1 1
输出样例#1:
WIN
LOSE
我一直0分,代码不知道错在哪 求助大佬
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 10005;
const int MAX_SG = 105;
int calculateSG(vector<int>& a) {
int n = a.size();
vector<int> sg(MAX_N, 0);
for (int i = 0; i <= n; i++) {
bool s[MAX_SG] = { false };
for (int j = 0; j < i; j++) {
s[sg[j] ^ sg[i - j - 1]] = true;
}
int mex = 0;
while (s[mex]) {
mex++;
}
sg[i] = mex;
}
return sg[n];
}
bool hasWinningStrategy(vector<int>& a) {
int sg = calculateSG(a);
return sg != 0;
}
int main() {
freopen("stomach.in","r",stdin);
freopen("stomach.out","w",stdout);
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
if (hasWinningStrategy(a)) {
cout << "WIN" << endl;
} else {
cout << "LOSE" << endl;
}
}
return 0;
}