zoukankan      html  css  js  c++  java
  • POJ 2484(对称博弈)

    题目链接:http://poj.org/problem?id=2484

    这道题目大意是这样的,有n个硬币围成一圈,两个人轮流开始取硬币(假设他们编号从1到n),可以选择取一枚或者取相邻的两枚(相邻是指他们的编号相邻)。在双方都采取最优策略取硬币的情况下,问谁最后会赢。

    这道题目我一开始没有什么好的办法,n从1试到7,大致能发现n>=3的时候是Bob赢,否则是Alice赢。

    可是为什么这样写正确呢?有没有严格一些的证明呢?

    我查阅了许多资料,有了下边的理解,可能不是很准确,望纠正。

    n<=3的时候显然易得。

    当n>3时,我们分成两种情况讨论。

    当n为偶数。我们可以把硬币环断开平均分成两列。

        先手先取,先手无论取一个还是两个硬币(此时无所谓最优了,或者说都是最优),对方的最优策略总是跟着先手去相同数量的硬币,这样保证最后一个硬币是被后手拿掉。后手赢。

    当n为奇数,如果先手取一个硬币,那么后手为了赢,他必须要想办法转化成n为偶数的情况,所以他取两个硬币;

          如果先手取两个硬币,那么后手为了赢,他必须要想办法转化成n为偶数的情况,所以他取一个硬币;

                   往后的过程就与上边分析的偶数情况一致了。

    综上分析,得到我们的正确答案;

    1 if(n>=3) printf("Bob");
    2 else printf("Alice");
  • 相关阅读:
    Android-Drawable
    DOM4J与JDOM解析xml文档
    SAX解析xml文档
    java中的xml简介与DOM解析xml
    二进制I/O
    java中的集合框架
    文本I/O
    Java中基本数据的包装类
    Sting 字符串类
    抽象类和接口
  • 原文地址:https://www.cnblogs.com/Wade-/p/6618501.html
Copyright © 2011-2022 走看看