CodeForces-1215D Ticket Game 博弈,思维
CodeForces-1215D Ticket Game 博弈,思维
题意
给定一个长度为偶数的字符串,由数字和\('?'\)组成。
两人开始轮流对\('?'\) 填数字,先手希望左边的和和右边的和最终不相等,后手希望相等。
问谁必胜
分析
显然从条件可以看出来这题的结果应该和每边的初始大小以及每边的初始问号个数有关。
如果左边问号个数等于右边问号个数,仅当左边的和等于右边和相等才会后手赢,否则先手赢。
再考虑一般情况,首先可以推理出左右的括号是可以抵消的,因为先手为了破坏平衡,总会在初始大的一边加9,而后手能做的也只是在另一边加9减小破坏。
所以最终可以归结为一边为问号的情况,那么就简单了。
后手能做的就是维持两者的和为9,所以如果\(del / 2 \cdot 9 = sum\) ,就表明可以维持
代码
char s[200005];
int cnt1, cnt2;
int sum1, sum2;
int main() {
int n = readint();
scanf("%s", s);
int len = strlen(s);
for (int i = 0; i < len; i++)
if (i < len / 2)
if (s[i] == '?') cnt1++;
else sum1 += s[i] - '0';
else {
if (s[i] == '?') cnt2++;
else sum2 += s[i] - '0';
}
if (cnt1 == cnt2) {
if (sum1 == sum2) puts("Bicarp");
else puts("Monocarp");
}
else {
if (sum1 > sum2) {
int del = cnt2 - cnt1;
if (del / 2 * 9 == sum1 - sum2) puts("Bicarp");
else puts("Monocarp");
}
else {
int del = cnt1 - cnt2;
if (del / 2 * 9 == sum2 - sum1) puts("Bicarp");
else puts("Monocarp");
}
}
}