Задания 19-21. Информатика. ЕГЭ. Шастин. 13.03.2025

Просмотры: 369
Изменено: 14 марта 2025

19

(Д. Бахтиев) Два игрока, Полина и Вероника, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Полина. За один ход игрок может уменьшить количество камней в одной из куч в два раза (если количество камней в куче нечётно, остаётся на \(1\) камень меньше, чем убирается) или убрать из одной из куч пять камней, при этом два камня перекладываются в соседнюю кучу, а оставшиеся три выбрасываются в океан несбывшихся надежд. Например, пусть в одной куче \(10,\) а в другой \(15\) камней; такую позицию мы будем обозначать \((10, 15).\) За один ход из позиции \((10, 15)\) можно получить любую из четырёх позиций: \((5, 17),\) \((12, 10),\) \((10, 7)\) и \((5, 15).\) Игра завершается в тот момент, когда суммарное количество камней в кучах становится не более \(69.\) Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в кучах будет \(69\) или меньше камней. В начальный момент в первой куче было \(35\) камней, во второй куче — \(S\) камней, \(S > 50.\) Укажите максимальное значение \(S,\) при котором Полина не может выиграть за один ход, но при любом ходе Полины Вероника может выиграть своим первым ходом.

20

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

  • Полина не может выиграть за один ход;
  • Полина может выиграть своим вторым ходом независимо от того, как будет ходить Вероника.

Найденные значения запишите в ответе в порядке возрастания.

21

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

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

Решение:

Python


from math import floor

def moves(h):
    h1, h2 = h
    return (floor(h1 / 2), h2), (h1, floor(h2 / 2)), (h1 - 5, h2 + 2), (h1 + 2, h2 - 5)

def game_over(heaps):
    return sum(heaps) <= 69

def win1(heaps):
    return not game_over(heaps) and any(game_over(m) for m in moves(heaps))

def lose1(heaps):
    return all(win1(m) for m in moves(heaps))

def win2(heaps):
    return not win1(heaps) and any(lose1(m) for m in moves(heaps))

def lose2(heaps):
    return all(win1(m) or win2(m) for m in moves(heaps)) \
        and any(win2(m) for m in moves(heaps))

z19 = [S for S in range(51, 1000) if lose1((35, S))]
z20 = [S for S in range(51, 1000) if win2((35, S))]
z21 = [S for S in range(51, 1000) if lose2((35, S))]
print(max(z19))
print(min(z20), max(z20))
print(min(z21))

Ответ:
\(70\)
\(71 \,\, 141\)
\(72\)