cdcq

梦幻小鱼干

导航

【2020牛客寒假算法基础集训营第五场】E题-Enjoy the game

原题:

 

 

n=100的时候可以dp,状态(i, j)表示现在有i张牌,最多可拿j个

f[i][j]=1表示必胜,f[i][j]=0表示必败,易证此题没有中间状态

如果某个状态后续存在必败状态,则此状态必胜,否则必败

打表观察

 

显然答案是2的幂必败,否则必胜

 

证明一下

答案与2的幂有关,因此自然从二进制入手

容易发现,一种具有一般性的必胜策略是选择二进制表达中最低的一个二进制位,即lowbit(n),然后就赢了

因为拿走lowbit(n)会导致从最低位开始出现几个连续的0,例如101拿走1变成100,110拿走10变成100

接下来对方拿走的数只能由小于等于这一位的二进制位组成,即110拿走10后,后手能拿的数只能由10和1组成

而这些对手能拿的二进制位都不存在于当前的剩余数量,因为一开始先手拿的是lowbit(n),往下没有更低的二进制位

因此必定会发生借位,假设后手拿的数是b,则第二次取牌后,易证剩余的数量的lowbit一定为lowbit(b)

例如10100,先手拿走100变成10000,加设后手拿11,则剩余数量变成1101,二者lowbit都为1,假设后手拿10,则变成1110,二者lowbit为10

易证lowbit(b)<=b<lowbit(n)(其中n是一开始拿走一个lowbit之后的n),即lowbit(b)对于先手来说是可拿的,而且是递减的

先手拿走lowbit(b),就又达成相似的局面,如此往复,直到剩余数量的lowbit减少为1,显然此时先手必胜

当n是2的幂时,先手不存在可拿的lowbit,因为n的lowbit是它本身,而题目规则不允许一开始就拿空(那样就不用玩了 = =b)

 

没有代码

posted on 2020-02-13 15:57  cdcq  阅读(226)  评论(0编辑  收藏  举报