D. Ticket Game(思维+bash博弈)

https://codeforces.com/problemset/problem/1215/D


思路:

取石子的取1,2....次都有结论吧。这里类似。

首先就是如果两边?不等最后会到达一个一边都是?的状态,两边也有一个差。

此时问题变成了给你一堆石头,每次可以取1,2,...9个。先手和后手谁赢。看%9即可。

这里还有一个小限制就是每个人要取剩下的?数量/2次。

这样思考,也就是说不管A取x,B能保证的就是取y为9-x,也就是只能保证是9的倍数。一共n/2次,也就是n/2*9==sum,B赢。不然就是A赢

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=2e5+1000;
typedef long long LL;
char a[maxn],b[maxn],s[maxn];
LL tot1=0,tot2=0;
inline LL read(){LL x=0,f=1;char ch=getchar();	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;}
int main(void)
{
  LL n;cin>>n;
  scanf("%s",s+1);
  for(LL i=1;i<=n/2;i++) a[++tot1]=s[i];
  for(LL i=n/2+1;i<=n;i++) b[++tot2]=s[i];

  LL sum1=0;LL qnum1=0;
  for(LL i=1;i<=tot1;i++){
    if(a[i]=='?') qnum1++;
    if(a[i]>='0'&&a[i]<='9') sum1+=(a[i]-'0');
  }
  LL sum2=0;LL qnum2=0;
  for(LL i=1;i<=tot2;i++){
    if(b[i]=='?') qnum2++;
    if(b[i]>='0'&&b[i]<='9') sum2+=(b[i]-'0');
  }
  LL numcnt=sum1-sum2;
  if(numcnt==0){
    if(qnum1==qnum2) cout<<"Bicarp"<<"\n";
    else cout<<"Monocarp"<<"\n";
  }
  else{
    if(numcnt>0){
        LL res=(qnum2-qnum1)/2;
        if(res*9==numcnt) cout<<"Bicarp"<<"\n";
        else cout<<"Monocarp"<<"\n";
    }
    else if(numcnt<0){
        LL res=(qnum1-qnum2)/2;
        if(res*9==abs(numcnt)) cout<<"Bicarp"<<"\n";
        else cout<<"Monocarp"<<"\n";
    }
  }
return 0;
}

猜你喜欢

转载自blog.csdn.net/zstuyyyyccccbbbb/article/details/114949444