Ticket Game(CF)
题目大意:
一个数列(保证是个数是偶数),前一半之和 与 后一半之和 如果相等 就称这个数列为开心数列
但是数列有些数字被擦掉了为'?' 现在M和B两人玩游戏 M先手,每一轮将'?'填0到9的数字
最终数列如果为开心则B胜利 如果不开心则M胜利 M和B都很聪明 给出数列求最终胜利者
分析
ans1表示前一半数字之和 ans2表示后一半的数字和
num1表示前一半'?'之和 num1表示后一半'?'数字和
分情况
num1=num2:
如果sum1=sum2 那么M先手后B只要保证和M在另一边选和A一样的数就能使得数列为开心 B必胜
如果sum1!=sum2 和上述相等的情况一样 M一直在一边填9,B只有跟着在另一边填9,但是初始值不同 数列一定是不开心的
num1>num2:
设两边"?"的差值cha=num1-num2
先不管怎么样 只要M是最后一个设置数字的 那他一定是能让数列不开心的
所以当cha为奇数的时候 M必胜
当cha为偶数的时候 B为最后一手
如果ans1>=ans2 M只要保证每次在前半部分填上9 前后数字和的差值只会增大不会减小 这样B最后一手怎么都填不上使之相等
如果ans1<ans2 如果B在前部分一直填9也没能让ans1>ans2那肯定最后数列一定不开心
如果M在前部分一直填9可以让ans1>ans2 那肯定最后数列也一定不开心
num1<num2的情况类似
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=2e5+5;
int n,prenum,endnum,presum,endsum;
char s[maxn];
int main(){
cin>>n;getchar();
for(int i=1;i<=n;i++)s[i]=getchar();
for(int i=1;i<=n/2;i++){
if(s[i]=='?')
presum++;
else prenum+=s[i]-'0';
}
for(int i=n/2+1;i<=n;i++){
if(s[i]=='?')
endsum++;
else endnum+=s[i]-'0';
}
if(presum==endsum){
if(prenum!=endnum)
cout<<"Monocarp"<<endl;
else cout<<"Bicarp"<<endl;
}
else {
if(presum<endsum){
int cha=endsum-presum;
if(cha&1)
cout<<"Monocarp"<<endl;
else {
if(endnum>=prenum)
cout<<"Monocarp"<<endl;
else{
if(endnum+(cha/2)*9<prenum||endnum+(cha/2)*9>prenum)
cout<<"Monocarp"<<endl;
else cout<<"Bicarp"<<endl;
}
}
}
else {
int cha=presum-endsum;
if(cha&1)
cout<<"Monocarp"<<endl;
else {
if(endnum<=prenum)
cout<<"Monocarp"<<endl;
else{
if(endnum<prenum+(cha/2)*9||endnum>prenum+(cha/2)*9)
cout<<"Monocarp"<<endl;
else cout<<"Bicarp"<<endl;
}
}
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?