📝 刷题记录 · 第6天

题型:前缀和+博弈策略 难度:夯 2026-05-11

📖 题目大意

棋盘是 2 行 n 列的矩阵,每格有一个分数 a[i][j]。游戏规则: Mandy 从左上角 (0,0) 开始,brz 从右下角 (1,n-1) 开始。 一开始,两人各自获取自己位置上的分数,然后该格分数消失。 Mandy 先手,每次可向上下左右移动(不能出界、不能移动到分数为 0 的格子),或者选择不动。 移动到的格子,获得该格分数,分数消失。 轮到对方,直到双方都无法移动游戏结束。 谁得分高谁赢,如果得分相同则平局。

💡 解题思路

⚙️ AC 代码


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

using int64 = long long;

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

    int T;
    cin >> T;
    while (T--) {
        int n;
        cin >> n;
        vector<int64> up(n + 1), down(n + 1);
        for (int i = 1; i <= n; i++) cin >> up[i];
        for (int i = 1; i <= n; i++) cin >> down[i];

        vector<int64> preUp(n + 1, 0), preDown(n + 1, 0);
        for (int i = 1; i <= n; i++) {
            preUp[i] = preUp[i - 1] + up[i];
            preDown[i] = preDown[i - 1] + down[i];
        }

        bool mandyWin = false, brzWin = false, draw = false;

        for (int i = 1; i <= n; i++) {
            int64 mandy = preUp[i] + preDown[i - 1];
            int64 brz   = (preUp[n] - preUp[i]) + (preDown[n] - preDown[i - 1]);

            if (mandy > brz) mandyWin = true;
            else if (mandy < brz) brzWin = true;
            else draw = true;
        }

        if (draw) cout << "draw\n";
        else if (mandyWin && !brzWin) cout << "Mandy\n";
        else if (brzWin && !mandyWin) cout << "brz\n";
        else {
            int i1 = (n + 1) / 2;
            int i2 = (n + 2) / 2;

            auto calc = [&](int i) {
                int64 mandy = preUp[i] + preDown[i - 1];
                int64 brz   = (preUp[n] - preUp[i]) + (preDown[n] - preDown[i - 1]);
                if (mandy > brz) return 1;
                if (mandy < brz) return -1;
                return 0;
            };

            int r1 = calc(i1), r2 = calc(i2);
            int r = max(r1, r2);
            if (r > 0) cout << "Mandy\n";
            else if (r < 0) cout << "brz\n";
            else cout << "draw\n";
        }
    }

    return 0;
}

📎 备注 & 易错点

  • 常见坑点1:不能贪心每次走最大数字,局部最优不等于全局最优,容易被对手反制。
  • 常见坑点2:区间和计算容易出错,前缀和下标要注意 1-based 或 0-based 的一致性。
  • 优化技巧:使用前缀和快速计算区间和,遍历每列作为转折点判断胜负,处理交错列保证完美策略。

📚 今日总结

📚 今日总结


← 返回我的学习主页 每日一题 · 持续进步