1 条题解

  • 0
    @ 2025-5-8 0:11:45

    解题思路

    对于这种题目,我们一般先手玩一波。

    手玩发现:同时先手当且仅当石子有偶数堆并且对称时必败(这一个结论看似简单,实际要想到可能会话几十分钟),因为后手只要照着先手操作,先手必败(至于唯一性只能靠感悟了)

    于是题目就转化成判断是否是对称的。

    做此类博弈类手玩题的技巧:

    一定要自己多手玩,几十次也不为过。要各种极端情况全部考虑 对于一种看似正确的算法,一定要尽量给出证明,实在不行也要多举例子直到实在举不出反例为止

    标程

    #include <iostream>
    #include <queue>
    #include <cstdio>   // 补充scanf所需头文件
    #include <vector>   // 补充priority_queue依赖的vector头文件(C++98需要显式包含)
    using namespace std;
    
    int main() {
        int n, x;
        while (scanf("%d", &n) != EOF && n) {  // 读取n直到遇到EOF或n为0
            int flag = 1;
            priority_queue<int> q;  // 默认使用vector<int>作为底层容器(需包含<vector>)
            int i;  // C++98要求变量声明在作用域开头
            for (i = 1; i <= n; ++i) {  // 遍历n个数
                scanf("%d", &x);         // 读取每个数
                q.push(x);               // 存入优先队列(大顶堆)
            }
    
            if (n % 2 == 1) {  // 奇数个元素直接无法配对
                cout << "1" << endl;
                continue;
            }
    
            // 偶数个元素时,检查是否能两两相等
            while (q.size() >= 2) {
                int m = q.top();  // 取最大元素
                q.pop();
                int n_val = q.top();  // 取次大元素
                q.pop();
                if (m != n_val) {  // 无法配对
                    cout << "1" << endl;
                    flag = 0;
                    break;
                }
            }
    
            if (flag) {  // 所有元素成功配对
                cout << "0" << endl;
            }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    741
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    1
    上传者