zoukankan      html  css  js  c++  java
  • CF36D New Game with a Chess Piece

    巴什博弈好题。

    如果没有跳 (k) 格的操作,根据奇偶性就可以得到答案。

    发现无论 (k) 是多少,用一次肯定扭转状态(相当于走了偶数次)。

    那无非就是不用操作赢的人想将操作次数控制为偶数,不用操作输的人想将操作次数控制为奇数。

    拿想改变状态的先手举例:

    • 如果跳一次后对手不能跳了,就赢了。
    • 如果各跳一次后自己不能跳了,就输了。
    • 如果自己不跳对手跳循环两次后自己不能跳了,也输了。
    • 如果自己不跳对手跳再自己跳对手不跳后自己不能跳了,也输了。

    但问题是判断后手到底能不能跳。对于后两种情况,可以发现两次都是 (k+1)

    从这里我们可以归纳出一种策略,即对手跳,自己就不跳;对手不跳,自己就跳。

    对于跳 (lfloorfrac{min{n-1,m-1}}{k+1} floor) 次能赢的人来说,他只要按这个策略操作,就可以获得胜利!

    但其实有很多细节。

    如果先手想要按这个策略操作,那他第一次到底是走还是跳呢?

    • (min{n-1,m-1}mod(k+1)=0),第一次跳即可。
    • (min{n-1,m-1}mod(k+1)>0),第一次走即可。

    如果后手想要按这个策略操作,先手有机会扭转局势!

    • (min{n-1,m-1}mod(k+1)=k),先手第一次跳。

    但这样交上去会 WA,观察数据再随便找找可以发现 (k=1)(n=m=3) 的时候会输出 + 而答案是 0

    (min{n-1,m-1}=d(k+1))。先手第一次跳后实行策略,接下来的 (d-1) 轮每轮和都是 (k+1)。最后剩下 (1),当 (k>1) 时先手是不能跳的,而 (k=1) 时可以。我们正是忽略了这个问题。

    所以特判 (k=1) 即可。具体地:

    • (n-1,m-1) 均是偶数。如果先手走,后手就在同一维走;如果先手跳,后手就跟着跳。先手必败。
    • (n-1,m-1) 存在至少一个奇数。如果两个都是奇数,就跳,否则走奇数那一维,这样就变成上一种情况。先手必胜。

    补充一个小疑点,为什么 (k>1) 较大的那一维的影响仅仅在于奇偶性?

    考虑先手走了较大的那一维,如果后手再走那一维仍然不会改变大小关系,那么显然正确。如果改变了大小关系,那此时两维大小相等,同时小的那维没有改变,相当于扭转了先后手,同样正确。(k=1) 的情况说白了也是如此。

  • 相关阅读:
    Python教程:从零到大师
    Hive 安装 & Mysql 安装
    Hive基本原理及配置Mysql作为Hive的默认数据库
    分布式存储系统-HDFS
    centos 6.4-linux环境配置,安装hadoop-1.1.2(hadoop伪分布环境配置)
    VirtualBox安装Centos出现E_FAIL (0x80004005)的解决方法
    Hadoop 中HDFS、MapReduce体系结构
    探索性测试及基本用例
    软件测试相关术语(测试策略 && 测试方案 ....)
    高效学习的疑问与思路[软技能]
  • 原文地址:https://www.cnblogs.com/May-2nd/p/14793417.html
Copyright © 2011-2022 走看看