https://codeforces.com/problemset/problem/1215/D
先手想赢的话,只有4种方案,要么就让左边尽可能大,如果我尽量选左边的?放9,然后后手肯定会让左边选0,右边选9(可能不是9,不过反正是逼近左边)去追上左边,如果无论如何左边都会比右边大,那么先手就肯定赢,即不可能左右相等。
剩下就是左边尽可能小,右边大和右边小,都枚举一遍,有一种方案能成立,先手就能获胜。
#include<bits/stdc++.h>
#define maxl 300010
using namespace std;
int n,m,ans;
int suml,sumr,resl,resr;
int a[maxl];
char s[maxl];
inline void prework()
{
scanf("%d",&n);
scanf("%s",s+1);
resl=resr=suml=sumr=0;
for(int i=1;i<=n/2;i++)
if(s[i]=='?')
resl++;
else
suml+=s[i]-'0';
for(int i=n/2+1;i<=n;i++)
if(s[i]=='?')
resr++;
else
sumr+=s[i]-'0';
}
inline void mainwork()
{
ans=0;
int t;
int tl=resl,tr=resr,tmpl=suml,tmpr=sumr;
t=min((resl+resr)/2,(resl+1)/2);//��߾����ܴ�
tmpl+=t*9;
t=min((resl+resr)/2,(resr+1)/2);
tmpr+=t*9;
if(tmpl>tmpr)
ans=1;
tl=resl,tr=resr,tmpl=suml,tmpr=sumr;
t=min((resl+resr)/2,(resl+1)/2);//��߾�����С
tmpl+=(resl-t)*9;
t=min((resl+resr)/2,(resr+1)/2);
tmpr+=(resr-t)*9;
if(tmpl<tmpr)
ans=1;
tl=resl,tr=resr,tmpl=suml,tmpr=sumr;
t=min((resl+resr)/2,(resr+1)/2);//�ұ߾����ܴ�
tmpr+=t*9;
t=min((resl+resr)/2,(resl+1)/2);
tmpl+=t*9;
if(tmpl<tmpr)
ans=1;
tl=resl,tr=resr,tmpl=suml,tmpr=sumr;
t=min((resl+resr)/2,(resr+1)/2);//�ұ߾�����С
tmpr+=(resr-t)*9;
t=min((resl+resr)/2,(resl+1)/2);
tmpl+=(resl-t)*9;
if(tmpl>tmpr)
ans=1;
}
inline void print()
{
if(ans)
puts("Monocarp");
else
puts("Bicarp");
}
int main()
{
int t=1;
//scanf("%d",&t);
for(int i=1;i<=t;i++)
{
prework();
mainwork();
print();
}
return 0;
}