两个人拿硬币,这个hacky解决方案

时间:2015-07-04 09:48:31

标签: algorithm puzzle game-theory

难题是:

  

一行中有n个硬币,硬币有不同的值。两名玩家轮流从线的一端取硬币,直到没有剩下的硬币。拥有更多金钱的玩家获胜。 如果n是偶数,是否有任何hacky算法可以决定第一个玩家在O(1)内存和O(n)时间内是赢还是输?

我已经解决了动态编程的问题,但我不知道 hacky算法是什么。搜索后,我找到了here的解决方案:

def firstWillWinEven(self, values):
    """
    odd_s: sum of values at odd position
    even_s: sum of values at even position
    if odd_s == even_s, the first mover cannot win if the other player mimics the first player
    if odd_s > even_s, the first mover chooses the odd position values, and FORCE the other player choose the even
    position values. The strategy and outcome are similar when even_s > odd_s.
    """
    odd_s = 0
    even_s = 0
    for i in xrange(len(values)):
        if i%2 == 0:
            even_s += values[i]
        else:
            odd_s += values[i]

    return odd_s != even_s

虽然我可以理解odd_s != even_s,但第一个人总是会赢,但我无法理解odd_s == even_s的情绪。 如果odd_s == even_s如何证明那里没有获胜策略?

1 个答案:

答案 0 :(得分:0)

原来我误解了解决方案。这是完整的解决方案:

def firstWillWin(self, values):
    """
    :param values: a list of integers
    :return: a boolean which equals to True if the first player will win
    """
    n = len(values)
    if n%2 == 0 and self.firstWillWinEven(values):
        return True

    return self.firstWillWinNormalCase(values)

如果odd_s != even_s,那么第一个人肯定会获胜。如果odd_s == even_s,我们不知道谁会赢,所以请回到firstWillWinNormalCase