棋盘
棋盘
零和博弈
对状态的分析,两个人都有先手截断的策略,偶数情况下,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;
}

浙公网安备 33010602011771号