Задание №19 — Теория игр
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) один камень либо увеличить количество камней в куче в два раза. Например, пусть в одной куче 10 камней, а в другой 7 камней; такую позицию в игре будем обозначать (10, 7). Тогда за один ход можно получить любую из четырёх позиций: (11, 7), (20, 7), (10, 8), (10, 14). Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.
Игра завершается в тот момент, когда произведение количеств камней в кучах становится не менее 144. Победителем считается игрок, сделавший последний ход, т. е. первым получивший такую позицию, что произведение количеств камней в кучах будет 144 или больше.
В начальный момент в первой куче был один камень, во второй куче — S камней;
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т. е. не являющиеся выигрышными независимо от дальнейшей игры противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна.
Правильный ответ
36
Пояснение
Решение:
Позицию обозначаем (x, y), а следить будем за произведением . Посмотрим, как его меняет ход: и (ведь и ), а удвоение любой кучи даёт ровно . Значит одним ходом произведение увеличивается не более чем вдвое, и удвоение кучи этот максимум как раз даёт.
Отсюда: игрок заканчивает игру своим ходом тогда и только тогда, когда , то есть когда .
В начальной позиции (1, S) произведение равно . После хода Пети оно не больше , после ответного хода Вани — не больше . Значит Ваня способен закончить игру своим первым ходом тогда и только тогда, когда , то есть при .
Проверим . Сам Петя не выигрывает: максимум, что он может, — довести произведение до , а нужно 144. Но если он удвоит вторую кучу, возникнет позиция (1, 72) с произведением 72; Ваня удваивает её ещё раз и получает (1, 144) с произведением 144 — игра закончена, выиграл Ваня.
Проверка перебором:
N = 144
def moves(p):
x, y = p
return [(x + 1, y), (2 * x, y), (x, y + 1), (x, 2 * y)]
def win1(p): # ходящий выигрывает первым же ходом
return any(x * y >= N for x, y in moves(p))
for s in range(1, 143):
p = (1, s)
# сам Петя выиграть не может, но неудачным ходом дарит победу Ване
if not win1(p) and any(win1(q) for q in moves(p)):
print(s) # 36
break
Ответ: 36