CodeFoeces 1215 D Ticket Game(数学,思维)
作者:互联网
CodeFoeces 1215 D Ticket Game
题目大意
M和B轮流玩游戏(每一轮M先手
现在给出一个长度为偶数的串,包含字符'?'和数字
现在两人依次在'?'上填数字\(0\)~\(9\)
若M先手,最后串的左右两部分数字之和相等,则B赢,反之M赢
solution
难得教练给一道稍稍简单的题QwQ
最好想的状态就是:
-
若一开始左边的和等于右边的和
- 若左边的'?'数量等于右边的,那么每次M放一个数字,B放一个同样的,显然B赢
- 反之,两边的'?'数量不相等,那么先手赢
-
若一开始两边的和不相等
- 如果大的一边'?'较多,那么先手必胜,因为后手不可缩小差距
- 反之,则就需要讨论一下了,前“小”次按照保持差距去放,然后剩下的次数,也就是两边个数之差,下面后手的任务就是缩小差距那么每次补齐9即可,也就是说,相差的数字除了B放的数字要求能被9整除,那么后手赢。反之,先手赢。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
// #include <cmath>
// #define int long long
using namespace std;
inline int read(){
int x = 0, w = 1;
char ch = getchar();
for(; ch > '9' || ch < '0'; ch = getchar()) if(ch == '-') w = -1;
for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
return x * w;
}
const int maxn = 55555;
char s[maxn];
int l, r;
int s1, s2;
int main(){
int n = read();
scanf("%s", s + 1);
for(int i = 1; i <= n / 2; i++){
if(s[i] == '?') l += 1;
else s1 += s[i] - '0';
}
for(int i = n / 2 + 1; i <= n; i++){
if(s[i] == '?') r += 1;
else s2 += s[i] - '0';
}
if(s1 < s2){
swap(s1, s2);
swap(l, r);
}
if(s1 == s2){
if(l == r) cout << "Biacarp" << '\n';
else cout << "Monocarp" << '\n';
}
else{
if(l >= r) cout << "Monocarp" << '\n';
else printf("%s\n", (r - l) % 2 == 0 && s1 - s2 == (r - l) /2*9? "Bicarp":"Monocarp");
}
}
标签:ch,数字,1215,int,CodeFoeces,反之,先手,Game,include 来源: https://www.cnblogs.com/rui-4825/p/12758810.html