1 条题解

  • 0
    @ 2024-10-21 11:16:03

    这是一个博弈题,我们要找寻某一方必定获胜或者必定失败的情况(即必胜态和必败态)。

    经过读题,很容易发现,kky是处于劣势的,因为kky需要不断选shuji选过的数字才能保持最终剩余的数字和shuji相同,所以我们可以考虑kky的必胜态是什么:

    当shuji和kky的数组顺序一样时,shuji选哪一个kky就选跟他一样的从而获胜,因为两人都能从数组的两端选择,所以当shuji的数组顺序与kky的正好相反时(即shuji的第一个到第n个数字等于kky的第n个到第1个数字),kky依然可以选择和shuji相同的以获得胜利;

    当上述两种情况均为出现时,shuji可以选择kky当前无法选择的一个数,而kky为了游戏进行,不得不选择一个shuji未选择的数x,此时shuji只要将这个x保留到最后即可获得胜利(不愧是shuji)。

    综上所述,只有当两数组相同或互相相反时kky赢,其他情况均为shuji赢。

    c代码:

    #include<stdio.h>
    const int N = 3e5 + 5;
    int a[N], b[N];
    int main() {
        int t;
        scanf("%d", &t);
        while (t--) {
            int n;
            scanf("%d", &n);
            for (int i = 1; i <= n; i++) {
                scanf("%d", &a[i]);
            }
            for (int i = 1; i <= n; i++) {
                scanf("%d", &b[i]);
            }
            int flag1 = 1, flag2 = 1;
            for (int i = 1; i <= n; i++) {
                if (a[i] != b[i]) {//判断正序
                    flag1 = 0;
                }
                if (a[i] != b[n - i + 1]) {//判断逆序
                    flag2 = 0;
                }
            }
            if (flag1 || flag2) {
                printf("kky\n");
            } else {
                printf("shuji\n");
            }
        }
        return 0;
    }
    

    c++代码,感兴趣可以学一下:

    #include<bits/stdc++.h>
    #define int long long
    #define pii pair<int,int>
    #define endl '\n'
    using namespace std;
    const int mod = 1e9 + 7, inf = 1e18, N = 2e5 + 5;
    void solve() {
        int n;
        cin >> n;
        vector<int> a(n), b(n);
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
        for (int i = 0; i < n; i++) {
            cin >> b[i];
        }
        if (a == b) {
            cout << "kky\n";
            return ;
        }
        reverse(a.begin(), a.end());//翻转数组
        if (a == b) {
            cout << "kky\n";
            return ;
        }
        cout << "shuji\n";
    }
    
    signed main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr),cout.tie(nullptr);
        int T = 1;
        cin >> T;
        while(T--) {
            solve();
        }
        return 0;
    }
    

    信息

    ID
    1023
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    109
    已通过
    18
    上传者