1740

来源:互联网 发布:linux在终端中打开rpm 编辑:程序博客网 时间:2024/04/30 14:55

1740算是“男人八题”里面代码最简单的了,当然,它背后的内涵很丰富。。。。

题意就是:n堆石子,1 <= n <= 10,每堆石子的数量m不超过100。Alice和Bob轮流取石子,Alice总是先玩。“取一次”定义为:在任一堆里取走至少一个石子(可以全取),然后这堆剩下的石子任意分给其他还有石子的各堆(可以不分)。两人都取最优策略,最后把剩下的石子全取走的赢。

结论:如果n为偶数,在这n个数字里找一对相等的数字,找出的数字不放回,最后如果可以取走所有数字,先取者输;否则先取者赢。

证明:如果n=1,先取者赢;

         如果n=2,并且m1=m2=1,先取者面对(1,1)必输;

         如果m1=m2=/=1,则先取者可以在某堆里全取(那对方就可以把剩下一堆一次走,输),也可以不全取;如果不全取,后取者在另一堆取相同数量使m1‘=m2’,最后总能使先取者面对(1,1),先取者必输;

         如果如果m1=/=m2,先取者在数量较大的一堆取走若干个使m1‘=m2’,则后取者面对(k,k)必输,先取者赢;

         如果n=3,先取者面对(m1,m2,m3),他可以把最大堆消灭,并把最小堆变得和第二大堆一样大,则后取者面对(k,k)必输,先取者赢;

         如果n是一个偶数,

1.如果先取者面对(m1,m1‘,m2,m2’,....,mk,mk‘),m1=m1‘,m2=m2’,....,mk=mk‘,后取者总能让先取者面对(m1‘‘,m1‘‘‘,m2‘‘,m2’‘‘,....,mk‘‘,mk‘‘‘),最后先取者面对(1,1,1,1,....,1,1),先取者必输;

2.否则先取者可以取最大的一堆,把变得它和最小堆一样大,石子分到其他堆,使其他堆可以配对,剩下的石子取走。比如先取者面对(12,34,36,56,66,71,84,93),然后最大堆是93,取走并分走81个就和最小堆12相等,这81个里面,2个分给第二堆,10个分给第四堆,13个分给第六堆,剩下56个取走,于是后取者面对(12,12,36,36,66,66,84,84),先取者赢;

          如果n是一个奇数,用上面类似的方法可以让先取者赢。

 

原创粉丝点击