help me,我要吐了
查看原帖
help me,我要吐了
544989
外星球来的人楼主2024/1/17 22:01

这是题目:

大大大胃王比拼已经进入最后的冠亚军争夺战,你和张师傅是仅剩的两位选手。最后比拼的规则如下:共有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;
}
2024/1/17 22:01
加载中...