Перейти к содержимому

Задание 20 ЕГЭ по информатике 2027: теория игр: выигрыш вторым ходом

Задание 20до 1 баллатеория игр: выигрыш вторым ходом
Раздел
Теоретические основы информатики
Максимальный балл
1 балл
Уровень
повышенный
Что проверяет
Умение найти выигрышную стратегию игры
Что нужно сделать
Для игры из задания 19 найти значения, при которых первый игрок не выигрывает за один ход, но выигрывает своим вторым ходом при любой игре соперника.
Как записать ответ
два числа в две клетки таблицы ответа, в порядке из условия
Время
Около 7 минут по обобщённому плану ФИПИ
Элемент кодификатора
2.15
Компьютер
Специальное ПО по плану ФИПИ не нужно: задание решают рассуждением, программа — для проверки
Файл к заданию
Нет — все данные в условии
В 2026 году
Тоже задание 20

Задание 20 ЕГЭ по информатике 2027 года проверяет, по формулировке обобщённого плана ФИПИ, «Умение найти выигрышную стратегию игры». Это продолжение игры из задания 19: там ищут минимальное S, при котором Ваня может выиграть своим первым ходом после неудачного первого хода Пети, а здесь — два наименьших S, при которых Петя не выигрывает за один ход, но выигрывает своим вторым при любой игре Вани.

Файла нет, специализированное ПО не предусмотрено: игра описана в условии, ответ — два числа в две клетки таблицы по возрастанию. Уровень повышенный, около 7 минут, за верный ответ 1 балл без частичного. В КИМ 2026 года под номером 20 стояло то же задание: спецификация 2027 года отмечает, что «Изменения структуры КИМ отсутствуют». Средний процент выполнения — 52,5 % в 2026 году.

Ниже — три типа задания с решением на Python, разбор демоверсии 2027 года и типичные ошибки; тренажёр с заданиями банка — сразу под текстом.

Тренажёр задания 20

Десять заданий номера 20 из банка тренажёра — с файлами, как на станции КЕГЭ. Решайте в песочнице Python прямо на странице или у себя; ответ проверяется по ключу, после проверки — верный ответ, разбор и решение на Python, а при ошибке — разбор от ИИ. Кнопка «Ещё 5 таких» у типа задания ниже даёт задания одного типа.

Загружаем задание…

Задание 20 вместе с остальными — в вариантах целиком.

Типы задания 20 с решением

Две кучи: добавить камни или увеличить кучу

Пример условия

Два игрока, Петя и Ваня, играют в две кучи камней, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) 5 камней или увеличить одну из куч в 2 раза. Игра заканчивается, когда суммарно в двух кучах становится не менее 118 камней. В начальный момент в первой куче 11 камней, во второй — S камней, 1 ≤ S ≤ 106.

Найдите два наименьших значения S, при которых Петя не может выиграть за один ход, но может выиграть своим вторым ходом независимо от того, как будет ходить Ваня. Значения запишите в ответе в порядке возрастания.

1. Позиция — пара (камни в первой куче, камни во второй). 2. Позиция выигрышная, если из неё есть ход в проигрышную; проигрышная, если все ходы ведут в выигрышные. 3. Условие «Петя выигрывает своим вторым ходом» сводится к вопросу «успевает ли игрок выиграть за k своих ходов»: П1 — «да» при k = 1, П2 — «да» при k = 2 и «нет» при k = 1. 4. Ответ «да» при k получается, если ход сразу заканчивает игру или если после хода соперник не выигрывает, а мы успеваем за k − 1 ход при любом его ответе.

На примере: при S = 26 Петя идёт в (11, 52), при S = 46 — в (11, 51); меньших подходящих значений нет. Ответ — 26 46.

Решение на Python
from functools import lru_cache

LIMIT = 118     # игра заканчивается, когда суммарно не меньше 118 камней
PLUS = 5        # «добавить в одну из куч 5 камней»
MULT = 2        # «увеличить одну из куч в 2 раза»
START = 11      # камней в первой куче


def moves(pos):
    """Позиции, которые можно получить из pos одним ходом."""
    a, b = pos
    return ((a + PLUS, b), (a, b + PLUS), (a * MULT, b), (a, b * MULT))


def is_over(pos):
    """Игра закончена: в двух кучах суммарно не меньше LIMIT камней."""
    return pos[0] + pos[1] >= LIMIT


@lru_cache(maxsize=None)
def win(pos, k):
    """Успевает ли игрок, чей сейчас ход, выиграть за k своих ходов."""
    if k == 0:
        return False
    for q in moves(pos):
        if is_over(q):
            return True                  # выиграл этим ходом
        # ход хорош, если Ваня не выигрывает сразу и мы успеваем за k - 1 ход
        if all(not is_over(r) and win(r, k - 1) for r in moves(q)):
            return True
    return False


found = []
for s in range(1, 107):
    if win((START, s), 2) and not win((START, s), 1):
        found.append(s)
        if len(found) == 2:
            break

print(found[0], found[1])

Ответ: 26 46

Одна куча: добавить камни или увеличить кучу

Пример условия

Два игрока, Петя и Ваня, играют в одну кучу камней, первый ход делает Петя. За один ход игрок может добавить в кучу 5 камней или увеличить количество камней в куче в 3 раза. Игра заканчивается, когда в куче становится не менее 87 камней. В начальный момент в куче было S камней, 1 ≤ S ≤ 86.

Найдите два наименьших значения S, при которых Петя не может выиграть за один ход, но может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.

1. Позиция здесь — одно число: сколько камней в куче; конец игры задан порогом 87. 2. Размечаем позиции с конца: если ход сразу заканчивает игру, позиция выигрышна для того, чей сейчас ход; иначе она выигрышна только тогда, когда ведёт в проигрышную. 3. В программе та же функция win(камни, k): П1 — это win(S, 1), а нужные S — где win(S, 2) верно, а win(S, 1) нет. 4. Идём по S от 1 вверх и берём первые два подходящих значения.

На примере: при S = 8 Петя идёт в 24; Ваня может получить 29 или 72, на что Петя отвечает 87 или 216. При S = 9 Петя идёт в 27; Ваня может получить 32 или 81, на что Петя отвечает 96 или 243. Меньших подходящих значений нет. Ответ — 8 9.

Решение на Python
from functools import lru_cache

LIMIT = 87      # игра заканчивается, когда камней не меньше 87
PLUS = 5        # «добавить в кучу 5 камней»
MULT = 3        # «увеличить количество камней в куче в 3 раза»


def moves(pos):
    """Количества камней, которые можно получить из pos одним ходом."""
    return (pos + PLUS, pos * MULT)


def is_over(pos):
    """Игра закончена: в куче не меньше LIMIT камней."""
    return pos >= LIMIT


@lru_cache(maxsize=None)
def win(pos, k):
    """Успевает ли игрок, чей сейчас ход, выиграть за k своих ходов."""
    if k == 0:
        return False
    for q in moves(pos):
        if is_over(q):
            return True                  # выиграл этим ходом
        # ход хорош, если Ваня не выигрывает сразу и мы успеваем за k - 1 ход
        if all(not is_over(r) and win(r, k - 1) for r in moves(q)):
            return True
    return False


found = []
for s in range(1, 87):
    if win(s, 2) and not win(s, 1):
        found.append(s)
        if len(found) == 2:
            break

print(found[0], found[1])

Ответ: 8 9

Одна куча: убрать камни или уменьшить кучу

Пример условия

Два игрока, Петя и Ваня, играют в одну кучу камней, первый ход делает Петя. За один ход игрок может убрать из кучи 3 камня, убрать 7 камней или уменьшить количество камней в куче в 3 раза (число при делении округляется до меньшего). Игра завершается, когда камней становится не более 47. В начальный момент в куче было S камней, S ≥ 48.

Найдите два наименьших значения S, при которых Петя не может выиграть за один ход, но может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.

1. Ходы уменьшают кучу, поэтому конец игры — позиции, где камней не больше 47; разметка идёт от 47 вверх по возрастанию камней. 2. Позиция выигрышная, если из неё есть ход в проигрышную. 3. В программе та же функция win(камни, k), но «игра закончена» проверяется условием «камней не больше 47», а ход «уменьшить в 3 раза» — целочисленное деление. 4. Подходящие S — где win(S, 2) верно, а win(S, 1) нет; берём два наименьших, начиная с 48.

На примере: при S = 147 Петя идёт в 144; Ваня может получить 141, 137 или 48, на что Петя отвечает 47, 45 или 45. При S = 148 Петя идёт в 145; Ваня может получить 142, 138 или 48, на что Петя отвечает 47, 46 или 45. Меньших подходящих значений нет. Ответ — 147 148.

Решение на Python
from functools import lru_cache

LIMIT = 47      # игра заканчивается, когда камней не больше 47
MIN1 = 3        # «убрать из кучи 3 камня»
MIN2 = 7        # «убрать из кучи 7 камней»
DIV = 3         # «уменьшить в 3 раза», деление с округлением вниз


def moves(pos):
    """Количества камней, которые можно получить из pos одним ходом."""
    return (pos - MIN1, pos - MIN2, pos // DIV)


def is_over(pos):
    """Игра закончена: в куче не больше LIMIT камней."""
    return pos <= LIMIT


@lru_cache(maxsize=None)
def win(pos, k):
    """Успевает ли игрок, чей сейчас ход, выиграть за k своих ходов."""
    if k == 0:
        return False
    for q in moves(pos):
        if is_over(q):
            return True                  # выиграл этим ходом
        # ход хорош, если Ваня не выигрывает сразу и мы успеваем за k - 1 ход
        if all(not is_over(r) and win(r, k - 1) for r in moves(q)):
            return True
    return False


found = []
for s in range(48, 500):
    if win(s, 2) and not win(s, 1):
        found.append(s)
        if len(found) == 2:
            break

print(found[0], found[1])

Ответ: 147 148

Как выполнять задание

  1. Выпишите из условия размеры куч, разрешённые ходы и порог окончания игры. Удвоение проверяйте первым — это самый быстрый ход.
  2. Отметьте границу условия «Петя не может выиграть за один ход»: если ход сразу заканчивает игру, такое S не подходит.
  3. Выберите способ: вручную позиции размечают с конца, программой перебирают S и проверяют условие функцией.
  4. Не путайте с заданием 19: там ищут S, при котором Ваня может выиграть своим первым ходом после неудачного первого хода Пети, — такие значения в ответ не идут.
  5. Запишите два числа по возрастанию, каждое в свою клетку таблицы.

Что нужно знать

  • Выигрышная и проигрышная позиция. Позиция выигрышная, если из неё есть ход в проигрышную; проигрышная, если все ходы ведут в выигрышные. Разметку ведут с конца, от законченных позиций.
  • Обозначения П1, В1, П2, В2. П1 — Петя выигрывает первым ходом; В1 — Ваня выигрывает первым ходом при любом ходе Пети; П2 — Петя выигрывает вторым при любой игре Вани.
  • Что просят в задании 20. Значения S, где П2 верно, а П1 нет.
  • Быстрый ход. Удвоение растёт быстрее сложения, поэтому его проверяют первым.

Как оценивается

Проверка автоматическая, по ключу: ответ должен быть записан в форме из условия и полностью совпасть с эталоном. Код и черновики не проверяют — значение имеет только ответ. За верный ответ — 1 балл, частичного балла нет.

Критерии всех заданий экзамена — на странице критериев ЕГЭ.

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

В демоверсии 2027 года игра та же, что в задании 19: в первой куче 17 камней, во второй S, за ход можно добавить 4 камня в любую кучу или удвоить любую, игра заканчивается при сумме не менее 133. Спрашивают два наименьших S, где Петя не выигрывает за один ход, но выигрывает вторым. Ключ ФИПИ — 28 48.

Граница первого условия: 17 + 2·58 = 133, значит S ≤ 57. При S = 28 Петя удваивает вторую кучу и получает (17, 56): Ваня не выигрывает (максимум 129), а на любой его ход у Пети есть ответ. При S = 48 Петя удваивает первую кучу: (34, 48); после удвоения второй (34, 96) Петя отвечает (38, 96) с суммой 134. Полный перебор S от 1 до 57 даёт только эти значения.

Типичные ошибки

Забывают условие «Петя не может выиграть за один ход»

«Петя не может выиграть за один ход» — обязательная часть условия: S, при котором первый же ход переводит сумму через порог, не подходит.

Проверяют не все ответы Вани

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

Берут только «жадный» ход

Первый ход Пети не обязательно удвоение большей кучи: перебрать нужно все варианты, иначе часть значений S теряется.

Ответ записан не в той форме

Нужны два числа по возрастанию, каждое в свою клетку таблицы. Перестановка чисел даёт 0 баллов.

Вопросы и ответы

Как решать задание 20 ЕГЭ по информатике?

Вручную позиции размечают с конца на выигрышные и проигрышные, программой перебирают S и проверяют условие функцией. Оба способа дают один ответ.

Можно ли решить задание 20 без программы?

Да: значения S невелики, ходов в игре немного. Но размечать позиции вручную долго, и одна пропущенная реакция Вани стоит балла.

Чем задание 20 отличается от 19 и 21?

19 — минимальное S, при котором Ваня может выиграть своим первым ходом после неудачного хода Пети. 20 — два наименьших S со стратегией Пети П2. 21 — минимальное S, где Ваня выигрывает не позже второго хода, но не первым.

Что изменилось в задании 20 в 2027 году?

Ничего: в КИМ 2026 года стояло то же задание. Спецификация 2027 года отмечает, что «Изменения структуры КИМ отсутствуют».

Другие задания раздела «Теоретические основы информатики»

По демоверсии, спецификации и кодификатору ФИПИ 2027
Обновлено:

Все задания ЕГЭ по информатике →