难题是:
一行中有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
如何证明那里没有获胜策略?
答案 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
。