codeforces 1215d D. Ticket Game
题意:有长度为n的串,内容为0-9数字或'?'。Mono先手,填数。Mono希望前n/2个数和!=后n/2个数和。Bicarp希望相等。问谁能赢。
记录两边的'?'数量lnum,rnum。记录两边和lsum,rsum。
如果两边lnum==rnum时。如果lsum==rsum。那Bicarp能赢,否则Mono能赢。
lnum!=rnum时:
{
如果num大的一边sum也大,那么Mono就能使这边尽量大。Mono能赢。
否则一边num大一边sum大:举例来看???90? 不论Mono填什么,Binarp在另一边填一样的数,最后左侧剩2个'?',不论Mono填什么,凑够9就行了。
然后如果右边<9,比如???80?,???00?。Mono只要在左侧都填9,右侧都填0,一定能赢。
如果右边>9,比如???99?。Mono在右边都填9,左边都填0就行。
这样看来除非恰好sum差值为9,否则Mono能赢。
再看?????9900?。Binarp能赢。推断abs(lnum-rnum)/2*9==abs(lsum-rsum)时Binarp能赢,否则Mono。
}
这题比赛时70分钟没做出来,赛后15分钟终于考虑全面了。
//#pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> #include <stack> #include <bitset> #include <unordered_set> #define mkp make_pair #define err cout<<"err"<<endl #define gmin(x,y) x=min(x,y) #define gmax(x,y) x=max(x,y) #define lss ll,mid,rt*2 #define rss mid+1,rr,rt*2+1 using namespace std; const double EPS=1e-10; typedef long long lon; typedef pair<lon,lon> pii; typedef unsigned long long ull; const lon SZ=200010,SSZ=21,APB=26,one=93,INF=0x3fffffffffffffff,mod=1000000007; const int intINF=0x3f3f3f3f; double PI=acos(-1); lon n,m; char ch[SZ]; void init() { cin>>n; cin>>ch+1; m=n/2; int lnum=0,rnum=0; int lsum=0,rsum=0; for(int i=1;i<=m;++i) { if(ch[i]=='?')++lnum; else lsum+=ch[i]-'0'; } for(int i=m+1;i<=n;++i) { if(ch[i]=='?')++rnum; else rsum+=ch[i]-'0'; } // if(abs(lsum-rsum)>9) // { // cout<<"Monocarp"<<endl; // } // else if(lnum==rnum) { if(lsum==rsum)cout<<"Bicarp"<<endl; else cout<<"Monocarp"<<endl; } else if(lnum>rnum&&lsum>rsum||rnum>lnum&&rsum>lsum) { cout<<"Monocarp"<<endl; } else { lon tmp=9*(abs(lnum-rnum)/2); if(abs(lsum-rsum)==tmp)cout<<"Bicarp"<<endl; else cout<<"Monocarp"<<endl; } } void work() { } int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); lon casenum; //cin>>casenum; //for(tim=1;tim<=casenum;++tim) //for(tim=1;cin>>n>>m;++tim) { //cout<<"Case "<<tim<<": "; //if(tim>=14)for(;;)cout<<"a"; init(); work(); } return 0; }