题目分享X

题意:一张票有n位数,如果这张票的前一半数字的和等于后一半数字的和(n一定是偶数),就称这张票为快乐票。有些数被擦除了,标记为’?’(’?‘的个数也是偶数),现在Monocarp 和 Bicarp 进行一个游戏,两人轮流将’?'变换成0到9的任意一个数,Monocarp先手,如果最后票为快乐票则Bicarp赢,否则Monocarp赢。

分析:这。。。没想到5分钟就过了,可能是这种题的套路见多了。。。

首先,将题目转换成左边x个问号,现有和为sx,右边y个问号,现有和为sy,然后再开始写数

首先不难发现,sx-sy才对结果有影响,单独的sx或sy对结果都没有影响,这是显然的

那么是不是只有x-y才对结果有影响呢?显然也是的,我是这么想的,可能有些不严谨

如果有人在左边写的a,那么另一个人显然一定会在右边也写a,因为如果右边的人不写a,而写b,那肯定说明b对于右边人来说比a更优,

也就是说右边的人会获得b-a这样的“好处”,这里的好处可以理解为帮助他离赢更进一步的垫脚石

要知道两边人写数的范围是相同的(0-9),左边的人咋可能让右边人白白获得好处,那么左边的人就会写b

要注意的是这是个套娃,但并不是个永久套娃

是个套娃的意思是,那么这时右边的人肯定会选择比b更优的c,而左边人又会选c(这里的选可以理解为心理上的博弈,虽然有点抽象或者是中二,但仔细想想就是这么回事)

但为什么不是个永久套娃呢?要知道,abc一定是满足单调性的,比如如果b>a会使右边人更优,那么如果c<a那么一定会使右边人更劣

也就是说你可以理解为一条单向的路,当然这条路是有尽头的,而且尽头一定是0或者9

这也是一个很重要的结论,在这里我们不单单证明了只有x-y对结果有影响,还证明了这两个人只会选0或9

记住这两个结论,

先用一用第一个结论,题目就被转换成了一共有p个问号(在同一边),数字和为q(在另一边)   这里的p咱就当他是正的,q就随意,这种假设显然是可以的,比如q如果是负的那就相当于数字和与问号在同一边呗,只不过咱这样规定左右比较好考虑,也比较好计算

转化完题目,再用上第二个结论,既然他俩现在站在同一边了,在庆幸他们没打起来的同时我们也要考虑接下来会发生什么,

如果一个人写了9,那么另一个人必然写0,因为显然对第一个人来说的“好处”对第二个人来说就是“坏处”

具体来说,如果将左边数字和增加对于第一个人来说是好处的话,那他就会选择写9并且这对第二个人来说就一定是“坏处”,也就是说第二个人不想让数字和增加,所以他会写0,

反之亦然

所以他们俩一人写一次下来以后,左边数字和一定增加9,左边一共有x-y个问号的话,那就一定增加(x-y)/2*9

也就是说,我们其实只需要判断(x-y)/2*9是否等于sy-sx即可,而且如果等于,就是后手也就是Bicarp赢了,不相等就是Monocarp赢了

还有一点就是这个判等于比较的并不是绝对值,就是原本的值,可以稍微想一下

如果右边的和是负数,也就是说左边既有数字又有问号,显然是不可能相等的

#include<cstdio>
using
namespace std; const int maxn=2e5+1; char a[maxn]; int main() { int n,l=0,r=0,lsum=0,rsum=0; scanf("%d%s",&n,a); for(int i=0;i<n/2;i++) if(a[i]=='?') l++;else lsum+=a[i]-'0'; for(int i=n/2;i<n;i++) if(a[i]=='?') r++;else rsum+=a[i]-'0';if(rsum-lsum==(l-r)/2*9) printf("Bicarp"); else printf("Monocarp"); return 0; }

猜你喜欢

转载自www.cnblogs.com/lin4xu/p/12757981.html
今日推荐