题意:
一张票有n位数,如果这张票的前一半数字的和等于后一半数字的和(n一定是偶数),就称这张票为快乐票。有些数被擦除了,标记为’?’(’?‘的个数也是偶数),现在Monocarp 和 Bicarp 进行一个游戏,两人轮流将’?'变换成0到9的任意一个数,Monocarp先手,如果最后票为快乐票则Bicarp赢,否则Monocarp赢。
分析
我们将左边右边的和设为s_1,s_2,左边右边的"?"个数设为w_1,w_2;
分情况:
if(s_1==s_2)
w_1==w_2 后手在先手另一边保持与先手出相同的即可,后手胜。
w_1!=w_2 和上面情况一样,后手出完他这边?时,s_1仍等于s_2.然后该先手出,先手必胜。
if(s_1<s_2) [如果s_1>s_2就把s_1和s_2,w_1和w_2换位置]
w_1<=w_2 先手往大的s_2上加数据,后手永远无法补齐,先手胜。
w_1>w_2 先手尽可能地将s_2变大,每次加9,后手每次给s_1加9,缩小差距,最后先手耗尽w_2,后手与先手一起加s_1,先手肯定不让s_1变大,后手尽可能地让s_1变大,加9,即现在每耗2个w,s_1就加9,若最后s_1==s_2后手胜,否则先手胜。
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int s1,s2,w1,w2,n;
char x;
void Swap(int &a,int &b){
int c=a;a=b;b=c;
}
int main(){
// freopen("1.in","r",stdin);
scanf("%d\n",&n);
for(int i=1;i<=n/2;++i){
scanf("%c",&x);
if(x>='0'&&x<='9')s1+=(x-'0');
else w1++;
}
for(int i=(n/2)+1;i<=n;++i){
scanf("%c",&x);
if(x>='0'&&x<='9')s2+=(x-'0');
else w2++;
}
if(w1+w2==0){
if(s1==s2)printf("Bicarp\n");
else printf("Monocarp\n");
return 0;
}
if(s1==s2){
if(w1==w2)printf("Bicarp\n");
else printf("Monocarp\n");
return 0;
}
if(s1>s2){Swap(s1,s2);Swap(w1,w2);}
if(w1<=w2){
printf("Monocarp\n");
return 0;
}
else{
w1-=w2;
if(w1%2==0){
if(s1+(w1/2)*9==s2)printf("Bicarp\n");
else printf("Monocarp\n");
}else{
printf("Monocarp\n");
}
}
return 0;
}