然后又先看看题目吧:
一张票有n位数,如果这张票的前一半数字的和等于后一半数字的和(n一定是偶数),就称这张票为快乐票。有些数被擦除了,标记为’?’(’?‘的个数也是偶数),现在Monocarp 和 Bicarp 进行一个游戏,两人轮流将’?'变换成0到9的任意一个数,Monocarp先手,如果最后票为快乐票则Bicarp赢,否则Monocarp赢。
这题是真的无聊。
思路啥的说白了就是个模拟。
思路:前面和后面的?两两配对,配对的都变成相同数字,剩下的?在的那边如果数字和也大于另一边,那么Monocarp赢,否则
看?两两和变成9(如果?剩奇数个,Monocarp赢)后是否前面等于后面,是的话 Bicarp赢,否则Monocarp赢;
我把思路给你了。
小细节:一定要找全所有情况,否则容易挂。
下面是代码:
1 #include <cstdio> 2 #include <algorithm> 3 #include <cmath> 4 using namespace std; 5 int ans1,cnt1,ans2,cnt2; 6 int main(){ 7 //freopen("a.in","r",stdin); 8 int n;scanf("%d\n",&n); 9 int m=n/2; 10 for(int i=1;i<=n;i++){ 11 char ch;scanf("%c",&ch); 12 if(i<=m){ 13 if(ch=='?')cnt1++; 14 else ans1+=ch-'0'; 15 } 16 else { 17 if(ch=='?')cnt2++; 18 else ans2+=ch-'0'; 19 } 20 } 21 if(cnt1==cnt2){ 22 if(ans1==ans2)printf("Bicarp"); 23 else printf("Monocarp"); 24 } 25 else if(cnt1>cnt2){ 26 if(ans1>=ans2)printf("Monocarp"); 27 else { 28 int shu=cnt1-cnt2,zhi=ans2-ans1; 29 if(shu%2==1||zhi%9!=0||(zhi/9)!=shu/2)printf("Monocarp"); 30 else printf("Bicarp"); 31 } 32 } 33 else { 34 if(ans2>=ans1)printf("Monocarp"); 35 else { 36 int shu=cnt2-cnt1,zhi=ans1-ans2; 37 if(shu%2==1||zhi%9!=0||(zhi/9)!=(shu+1)/2)printf("Monocarp"); 38 else printf("Bicarp"); 39 } 40 } 41 return 0; 42 }