博弈论——小游戏(有点思维两)

然后又先看看题目吧:

一张票有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 } 

猜你喜欢

转载自www.cnblogs.com/DZN2004/p/12758729.html