19.01 Перекладывание камней одна куча
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень, увеличить количество камней в куче в два раза, если оно нечётное, или в полтора раза, если оно чётное. Например, если в куче 5 камней, то за один ход можно получить 6 или 10 камней, а если в куче 6 камней, то за один ход можно получить 7 или 9 камней.
Игра завершается, когда количество камней в куче достигает 108. Победителем считается игрок, сделавший
последний ход, то есть первым получивший кучу, в которой будет 108 или больше камней. В начале игры в куче было S
камней, .
Укажите максимальное значение S, при котором Петя не может выиграть первым ходом, но при любом первом ходе Пети Ваня может выиграть своим первым ходом.
Решение руками
Поймём, что любое число можно будет увеличить как минимум в полтора раза.
Нам нужно найти такое, чтобы Петя, увеличив его, не победил, а Ваня одержал победу.
Очевидно, что нечётные числа более проверять не стоит, ведь
, что будет победой, аналогично с
большими числами.
Проанализируем чётные числа. Они могут быть увеличены в полтора раза. Число , к примеру, даст нам
, что будет победой, аналогично с большими числами.
Возьмём . Петя, прибавив
, даст Ване возможность увеличить число в
раза и проиграет. Вариант
увеличить число в
раза для Пети тоже критичен.
. Ваня вновь может умножить число на
и
выиграть. Получаем, что
нам подходит. Максимальное нечётное число будет точно меньше
, что меньше
. Мы же вычислили максимальное чётное, которое может подойти Ване без победы Пети первым
ходом.
Ответ:
Решение программой:
Для решения на Python используем рекурсию с проверкой всех возможных ходов (,
или
), чтобы
определить, чья это выигрышная позиция.
Функция возвращает , если игра уже завершена (камней
), положительное число — если при оптимальной
игре побеждает текущий игрок, и отрицательное – если побеждает соперник.
Так как первый ход делает Петя, цикл запускается от его лица: если значение функции положительное, выигрвает
Пете, а если отрицательное – Ваня. Если функция вернёт - значит Петя гарантированно проиграл первым
ходом, а Ваня выиграл. При переборе возможных начальных значений программа выводит максимальное
.
# lru_cache позволит сэкономить ресурсы компьютера. Функция будет сохранять прошлые значения функций, а значит не придётся считать из заново. from functools import lru_cache @lru_cache(None) def game(first_heap): # Функция игры if first_heap >= 108: # Если камней в куче стало больше 108 return 0 # Прекращаем игру moves = [game(first_heap + 1)] # Прописываем ходы возможные в партии if first_heap % 2 == 0: # Если чётное - увеличим в полтора раза, иначе в 2 moves.append(game(first_heap * 1.5)) else: moves.append(game(first_heap * 2)) petya_win = [i for i in moves if i <= 0] if petya_win: # Проверяем есть ли выигрыш Пети в данной позиции return -max(petya_win) + 1 # От лица Пети будет выигрыш (положительное число, прибавляем 1, поскольку это будет уже следующий ход) else: # Если в данной позиции выигрыш Вани return -max(moves) # От лица Пети будет проигрыш (отрицательное число) for i in range(2, 108): # Переберём возможные значения if game(i) == -1: # Если в данной позиции возможен выигрыш Вани первым ходом print(i) # Выведем нужное значение
Специальные программы

Программа
лояльности v2.0
Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!
Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение
Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты
Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей
Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ
Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!