МУМ5 → Информатика → задания → № 21

Задание 21 ЕГЭ информатика

Дерево игры и выигрышная стратегия

Условие игры к заданиям 19–21

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может:

– добавить в одну из куч (по своему выбору) 4 камня;

– увеличить количество камней в одной из куч (по своему выбору) в 2 раза.

Например, пусть в одной куче 20 камней, а в другой 30 камней; такую позицию в игре обозначим (20, 30). Тогда за один ход можно получить любую из четырёх позиций: (24, 30), (20, 34), (40, 30), (20, 60).

Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в тот момент, когда суммарное количество камней в двух кучах становится не менее 133. Победителем считается игрок, сделавший последний ход, то есть первым получивший такую игровую позицию, при которой в двух кучах суммарно 133 камня или больше. В начальный момент в первой куче было 17 камней, во второй куче – SS камней; 1≤S≤1151 \le S \le 115.

Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.

Источник: ФИПИ, проект демоверсии ЕГЭ 2027, с. 18

Как это было в демоверсии 2027

Для игры, описанной в задании 19, найдите наименьшее значение SS, при котором одновременно выполняются два условия:

– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;

– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Источник: ФИПИ, проект демоверсии ЕГЭ 2027, с. 18

Решение и ответ
  1. Та же рекурсия, что в задании 20. Победа Вани первым ходом — n=2n = 2, первым или вторым — n=4n = 4.

  2. from functools import lru_cache
    
    def moves(a, b):
        return (a + 4, b), (a, b + 4), (2 * a, b), (a, 2 * b)
    
    @lru_cache(None)
    def f(a, b, n):  # n — сколько ходов осталось; при нечётном n ходит тот, чью победу проверяем
        if a + b >= 133:
            return n % 2 == 0           # последний ход сделал «наш» игрок
        if n == 0:
            return False
        h = [f(x, y, n - 1) for x, y in moves(a, b)]
        return any(h) if n % 2 == 1 else all(h)
    
    print([s for s in range(1, 116) if not f(17, s, 2) and f(17, s, 4)][:1])
    
  3. Ищем SS, где f(17,S,4)f(17, S, 4) истинно, а f(17,S,2)f(17, S, 2) ложно. Наименьшее — 44.

Ответ: 44

Разбор задания 21 демоверсии →

Собрать пробник