Головоломка:Два человека принимают монеты, то Hacky Раствора
Есть ˝n˝ монеты в строке, монеты имеют различные значения. Два игрока по очереди берут монету с одного из концов линии, пока не осталось больше монет. Побеждает игрок с большей суммой денег. Если n равно, есть ли какой-нибудь хакерский алгоритм, который может решить, победит ли первый игрок или проиграет в 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
situtation. Как доказать, что нет выигрышной стратегии, если odd_s == even_s
?
Решение неверно. Если значения 3,1,2,4, сумма значений нечетной позиции равна сумме значений четной позиции. Но первый человек может выиграть, выбрав 4, а затем либо 2, либо 3. – interjay
@interjay Итак, это означает, что хакерское решение должно быть 'if odd_s! = Even_s: return true', в противном случае вернуться к нормальному DP? – laike9m
Возможно, то, что хотел сказать автор кода, заключается в том, что первый игрок никогда не проиграет в случае, если 'odd_s == even_s', то есть выберет либо нечетные номера монет с четным номером, но не оба. Я не думаю, что для первого игрока в этом случае может быть универсальная стратегия выигрыша. – afenster