Задания 19–21 ЕГЭ по информатике 2027 — игра с двумя кучами камней
Разбор заданий 19, 20 и 21 ЕГЭ по информатике 2027: две кучи, ходы +4 и ×2, конец при сумме 133. Вопросы демоверсии и ответы 29, 28 48 и 44; одна функция на Python для всех трёх номеров.
В 2027 году задания 19, 20 и 21 играются на двух кучах: за ход игрок добавляет 4 камня в одну из куч или удваивает одну из куч, а игра заканчивается, когда сумма камней достигает 133. В первой куче 17 камней, во второй S. В демо 2026 игра шла на одной куче. Вопросы: 19 — наименьшее S, при котором Ваня выиграл своим первым ходом (эта формулировка новая); 20 — два наименьших S, при которых Петя выигрывает вторым ходом; 21 — наименьшее S, при котором Ваня выигрывает первым или вторым ходом (как и в 2026). Ответы демо: 29, 28 48 и 44. Все три номера решает одна функция на Python; ниже — условие, объяснение каждого ответа, код и отличия от демо 2026.
Игры на одной и на двух кучах с вопросами «при любом ходе Пети» разобраны в статьях о задании 19, задании 20 и задании 21: понятия выигрышной и проигрышной позиции там те же.
Условие демоверсии 2027
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) 4 камня или увеличить количество камней в одной из куч в 2 раза. Например, из позиции (20, 30) за один ход можно получить (24, 30), (20, 34), (40, 30) или (20, 60).
Игра завершается, когда суммарное количество камней в кучах становится не менее 133. Победителем считается игрок, сделавший последний ход. В начальный момент в первой куче 17 камней, во второй — S камней, 1 ≤ S ≤ 115. Игрок имеет выигрышную стратегию, если может выиграть при любых ходах противника.
- Задание 19. Известно, что Ваня выиграл своим первым ходом. Укажите минимальное значение S, при котором такая ситуация возможна. Ответ: 29.
- Задание 20. Найдите два наименьших значения S, при которых у Пети есть выигрышная стратегия, причём Петя не может выиграть за один ход, но может выиграть своим вторым ходом независимо от игры Вани. Ответ: 28 48.
- Задание 21. Найдите наименьшее S, при котором у Вани есть стратегия выиграть первым или вторым ходом при любой игре Пети, но нет стратегии гарантированно выиграть первым ходом. Ответ: 44.
Задание 19: наименьшее S, при котором Ваня выиграл первым ходом
Разберём условие. «Ваня выиграл своим первым ходом» — значит, Петя не выиграл сразу, а после какого-то хода Пети Ваня смог довести сумму до 133 одним ходом. Не «при любом ходе Пети», а «нашёлся такой ход». Это важно для кода: нужен any, а не all.
При S = 29 позиция (17, 29). Петя не может закончить игру: самый сильный ход — удвоить вторую кучу — даёт (17, 58), сумма 75. Но после этого хода Ваня удваивает 58 и получает (17, 116) — 133 камня, победа. Значит, при S = 29 ситуация возможна.
При S = 28 после удвоения (17, 56) Ваня удвоением получает 17 + 112 = 129 — мало; добавление четырёх даёт ещё меньше. Другие ходы Пети оставляют суммы ещё дальше от 133. Ни после одного хода Пети Ваня не выигрывает сразу. Поэтому наименьшее S — 29.
| S | Лучший ход Пети | Ответ Вани | Сумма |
|---|---|---|---|
| 28 | (17, 56) | удвоить 56 | 129 — не хватает |
| 29 | (17, 58) | удвоить 58 | 133 — победа |
Задание 20: два наименьших S с выигрышем Пети вторым ходом
Условие двойное: Петя не выигрывает первым ходом, но у него есть ход, после которого любой ответ Вани оставляет Пете выигрыш за один ход.
При S = 28 такой ход — удвоить вторую кучу: (17, 56). Ответы Вани и выигрыш Пети:
| Ход Вани из (17, 56) | Позиция | Выигрышный ход Пети |
|---|---|---|
| +4 в первую | (21, 56) | удвоить 56 → 21 + 112 = 133 |
| +4 во вторую | (17, 60) | удвоить 60 → 17 + 120 = 137 |
| удвоить первую | (34, 56) | удвоить 56 → 34 + 112 = 146 |
| удвоить вторую | (17, 112) | +4 → 133 |
При S = 48 выигрышный первый ход Пети — удвоить первую кучу: (34, 48); дальше любой ответ Вани тоже закрывается одним ходом. Между 28 и 48 таких S нет: при S от 29 до 47 либо Петя выигрывает сразу, либо у Вани находится ответ, после которого Петя не закрывает игру. Ответ: 28 48, в порядке возрастания.
Задание 21: наименьшее S с выигрышем Вани первым или вторым ходом
Два условия: при любом ходе Пети Ваня выигрывает не позже своего второго хода, и при этом не при любом ходе Пети он выигрывает первым. При S = 44 из четырёх ходов Пети один — удвоить вторую кучу до (17, 88) — отдаёт Ване мгновенную победу удвоением 88. Остальные три — (21, 44), (17, 48), (34, 44) — мгновенной победы не дают, но после каждого из них у Вани есть ход, который закрывает игру его вторым ходом при любом ответе Пети. Для S от 40 до 43 это условие не выполняется. Ответ: 44.
Проверять такое руками долго, и именно здесь нужен код.
Одна функция на три номера
from functools import lru_cache
LIMIT = 133
FIRST = 17
def moves(p):
a, b = p
if a + b >= LIMIT:
return [] # игра окончена, ходов нет
return [(a + 4, b), (a, b + 4), (a * 2, b), (a, b * 2)]
@lru_cache(None)
def win(p, k):
"""Ходящий из позиции p выигрывает не позже чем за k своих ходов."""
if any(sum(m) >= LIMIT for m in moves(p)):
return True
if k == 1:
return False
return any(all(win(t, k - 1) for t in moves(m)) for m in moves(p))
good19 = []
good20 = []
good21 = []
for s in range(1, 116):
p = (FIRST, s)
if win(p, 1): # Петя выигрывает сразу — не подходит никому
continue
if any(win(t, 1) for t in moves(p)):
good19.append(s) # 19: нашёлся ход Пети, после которого Ваня выигрывает
if win(p, 2):
good20.append(s) # 20: Петя выигрывает вторым ходом
if all(win(t, 2) for t in moves(p)) and not all(win(t, 1) for t in moves(p)):
good21.append(s) # 21: Ваня выигрывает за два, но не гарантированно за один
print(good19[0]) # 29
print(good20[0], good20[1]) # 28 48
print(good21[0]) # 44
Позиция — кортеж из двух куч, moves возвращает четыре хода или пустой список для законченной игры. win(p, k) — есть ли у того, кто ходит из p, выигрыш не позже чем за k своих ходов: либо он заканчивает игру сразу, либо находит ход, после которого на любой ответ противника у него остаётся выигрыш за k − 1. Кеш обязателен: позиций немного, но без кеша рекурсия пересчитывает их тысячи раз.
Три вопроса — три условия в цикле. Для 19 — any по ходам Пети: Ване достаточно одного подходящего хода Пети. Для 20 — win(p, 2) при not win(p, 1). Для 21 — после каждого хода Пети Ваня выигрывает за два (all(win(t, 2))), но не после каждого — за один.
Чем 2027 отличается от демо 2026
| Демоверсия 2026 | Демоверсия 2027 | |
|---|---|---|
| Кучи | одна, конец — 30 камней или меньше | две, конец — сумма не меньше 133 |
| Ходы | убрать 3, убрать 5, уменьшить в 4 раза | +4 к одной куче, ×2 одной кучи |
| 19 | наименьшее S; Ваня выигрывает при любом ходе Пети (all) | наименьшее S; известно, что Ваня выиграл (any) |
| 20 | два наименьших S | два наименьших S |
| 21 | наименьшее S | наименьшее S |
Разница между any и all в задании 19 — не придирка: это разные множества S и разные ответы. Фраза «известно, что Ваня выиграл своим первым ходом» — any; «при любом ходе Пети Ваня выигрывает первым ходом» — all. Читай формулировку буквально.
Типичные ошибки
all вместо any в задании 19
Демо 2026 требовало выигрыша Вани при любом ходе Пети. В демо 2027 достаточно одного хода. С all ответ другой.
Наибольшее вместо наименьшего
В 2027 просят наименьшие S. Список подходящих S сортируется по возрастанию сам, если цикл идёт от 1; брать нужно первые элементы, а не последние.
Ходы только к одной куче
Четыре хода, а не два: прибавить к любой из куч, удвоить любую. Пропущенный ход меняет все три ответа.
Конец игры не по сумме
Игра заканчивается, когда сумма куч не меньше 133, а не когда одна из куч достигла порога. Сравнение — с a + b.
Петя выигрывает сразу
В 20 и 21 значения S, при которых Петя может выиграть первым ходом, не подходят по самим условиям — отсев win(p, 1) там часть условия. В 19 формулировка 2027 года прямо этого не запрещает: если Петя может выиграть сразу, но сходил неудачно, «Ваня выиграл своим первым ходом» тоже возможно. На наименьший ответ демо это не влияет — 29 в обоих прочтениях, — но в вариациях «наибольшее S» или «сколько значений S» ответы разойдутся. Читай условие буквально.
Подборка ошибок по всем номерам — в статье Типичные ошибки на ЕГЭ по информатике.
Тайминг на экзамене
| Этап | Время |
|---|---|
| Прочитать три вопроса, выписать порог, кучи и ходы | 2 мин |
Набрать moves и win по шаблону | 3 мин |
| Три цикла, запуск, три ответа | 3 мин |
Проверить moves на примере из условия: (20, 30) | 1 мин |
| Итого | 9–10 мин |
Спецификация отводит на три задания 22 минуты суммарно. Запас есть; потратить его стоит на перечитывание формулировок: «известно, что» против «при любом», наименьшее против наибольшего.
Как тренироваться
- Реши демо руками до задания 19 — таблица с S = 28 и 29 выше — и сверь с кодом.
- Пять игр на двух кучах с другими ходами и порогом — меняются только
movesиLIMIT. - Три задания на одной куче в формулировке демо 2026 тем же шаблоном с
all— чтобы не путать формулировки. - Проверяй
movesна примере из условия — в демо он дан явно: из (20, 30) четыре позиции.
Как изменились остальные номера — в обзоре ЕГЭ по информатике 2027: что изменилось; демозадания в контексте варианта — в разборе демоверсии 2027. Рекурсия с кешем и any/all — в подборке Python-идиом; та же идея «ответ позиции зависит от ответов соседей» — в статье о динамическом программировании.
Короткий итог
Задания 19–21 в 2027 году — две кучи, ходы +4 и ×2 к любой из них, конец по сумме. Одна функция win(p, k) с кешем и три условия: any для 19, win(p, 2) для 20, all(win(t, 2)) без all(win(t, 1)) для 21. Ответы демо — 29, 28 48 и 44, и все три меняются, если перепутать any и all или взять наибольшее вместо наименьшего.
Задания 19–21 в форме 2027 года с автопроверкой есть в TuteMe: две кучи, конец по сумме, вопросы как в демо.