棋盘

棋盘

零和博弈
对状态的分析,两个人都有先手截断的策略,偶数情况下,Mandy拥有在n/2的裁决权。奇数情况下,两人都只能在中心两端裁决。
如果能够获胜,则直接裁决,否则只能去判断一往无前的情况,就是说对于劣势的一方没有回头路,而优势的一方无法退让。
这样的裁决基本发生在中心附近

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

void solve() {
    int n; cin >> n;
    vector<ll> up(n + 1, 0), down(n + 1);
    ll u = 0, d = 0;
    for(int i = 1; i <= n; i ++) cin >> up[i], u += up[i];
    for(int i = 1; i <= n; i ++) cin >> down[i], d += down[i];
    
    ll tol = u + d;
    ll cut = 0;
    for(int i = 1; i <= n / 2; i ++) cut += up[i] + down[i];
    if(cut > tol - cut) cout << "Mandy\n";//先手截断
    else if(cut == tol - cut) {//brz没有退让权力,最优解是平局
        if(u > d) cout << "Mandy\n";
        else cout << "draw\n";
    }
    else {
        ll k = cut + up[n/2 + 1] + down[n/2 + 1];
        if(k < tol - k) cout << "brz\n";//brz有退让权力
        else if(k == tol - k) {//退让后依然平局,判断不退让
            if(d > u) cout << "brz\n";
            else cout << "draw\n";
        }
        else {//brz没有退让权力,但是无法阻止Mandy,因为Mandy手握先手,可以提前入侵
            if(u > d) cout << "Mandy\n";
            else if(u == d) cout << "draw\n";
            else cout << "brz\n";
        }
    }
}

int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int _ = 1; cin >> _;
    while(_--) solve();
    return 0;
}
posted @ 2026-11-03 21:20  thenrify  阅读(3)  评论(0)    收藏  举报