← 返回题目页

A2015 取石子

标程

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    cin >> T;
    while (T--) {
        int n;
        cin >> n;
        long long S = 0;
        int h = 0;                        // 恰好 1 颗石子的堆数
        for (int i = 0; i < n; i++) {
            long long a;
            cin >> a;
            S += a;
            if (a == 1) h++;
        }
        int p = n;                        // 堆数
        long long E = S - 2LL * p + h;     // 相对「每堆 1 或 2」的富余量

        bool win;
        if (E == 0 && (h == p || h == p - 1)) {
            // 特殊布局:除至多一堆是 2 颗以外全是 1 颗
            win = (h % 3 != 0);
        } else if (h % 2 == 1) {
            // 1 颗石子的堆数为奇数
            win = true;
        } else {
            // 一般布局:看 S + p + h 的奇偶性
            win = ((S + p + h) % 2 == 0);
        }
        cout << (win ? "YES" : "NO") << '\n';
    }
    return 0;
}

动画演示