Задания 19-21. Информатика. ЕГЭ. Статград. 24.10.2024-1
- Просмотры: 541
- Изменено: 24 ноября 2024
19
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может выполнить любое из следующих трёх действий:
- убрать из кучи один камень;
- если количество камней в куче кратно трём, уменьшить его в три раза, в противном случае убрать из кучи два камня;
- если количество камней в куче кратно пяти, уменьшить его в пять раз, в противном случае убрать из кучи три камня.
Например, если в куче \(12\) камней, то за один ход можно получить \(11\), \(4\) или \(9\) камней.
Игра завершается, когда количество камней в куче становится не более \(19\). Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет \(19\) или меньше камней.
В начале игры в куче было \(S\) камней, \(S > 19.\)
Укажите минимальное значение \(S\), при котором Петя не может выиграть первым ходом, но при любом первом ходе Пети Ваня может выиграть своим первым ходом.
20
Для игры, описанной в задании 19, найдите два наименьших значения \(S,\) при которых Петя не может выиграть первым ходом, но у Пети есть выигрышная стратегия, позволяющая ему выиграть вторым ходом при любой игре Вани. В ответе запишите найденные значения в порядке возрастания.
21
Для игры, описанной в задании 19, найдите минимальное значение \(S,\) при котором у Вани есть стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети, но у Вани нет стратегии, которая позволила бы ему гарантированно выиграть первым ходом.
Решение:
Python
def moves(h):
return h - 1, h // 3 if h % 3 == 0 else h - 2, h // 5 if h % 5 == 0 else h - 3
HEAP_SIZE = 20
heap = [None] * 200
for i in range(199, 19, -1):
if any(x < HEAP_SIZE for x in moves(i)):
heap[i] = 'P1'
for i in range(199, 19, -1):
if not heap[i] and all(heap[x] == 'P1' for x in moves(i)):
heap[i] = 'V1'
print('Решение 19 задачи')
for i in range(199, 19, -1):
if heap[i] == 'V1':
print(i)
for i in range(199, 19, -1):
if not heap[i] and any(heap[x] == 'V1' for x in moves(i)):
heap[i] = 'P2'
print('Решение 20 задачи. Выбери 2 минимальных значения')
for i in range(199, 19, -1):
if heap[i] == 'P2':
print(i)
for i in range(199, 19, -1):
if not heap[i] and all(heap[x] in ('P1', 'P2') for x in moves(i)):
heap[i] = 'V2'
print('Решение 21 задачи. Выбери минимальное значение')
for i in range(199, 19, -1):
if heap[i] == 'V2':
print(i)
Ответ:
\(23\)
\(26 \,\, 69\)
\(28\)