6 мин чтения

Задание 22 ЕГЭ по информатике 2027 — сколько процессов идёт на k-й миллисекунде

Разбор задания 22 ЕГЭ по информатике 2027: таблица процессов с 0 у независимых и зависимостями вперемешку, вопрос «сколько процессов выполняются на 7-й мс» (ответ 8). Расписание на Python, перенос данных из таблицы в текст и ловушка сдвига на единицу.

Задание 22 в 2027 году задаёт новый вопрос к знакомой таблице процессов: сколько процессов параллельно выполняются на k-й миллисекунде. В демоверсии ФИПИ это 7-я миллисекунда и ответ 8. Таблица та же, что в демо 2026: независимый процесс помечен нулём, а зависимости идут вперемешку — процесс 1 ждёт процессы 3 и 25, которые стоят в таблице ниже. Ниже — условие демо, расчёт расписания, разбор типового примера из условия руками, код на Python, который печатает 8, и ловушка сдвига на единицу.

Вопрос «минимальное время выполнения всех процессов» разобран в статье о задании 22, включая решение в LibreOffice Calc. Расписание там считается так же; отличается вопрос.

Условие демоверсии 2027

В файле содержится информация о совокупности N вычислительных процессов, которые могут выполняться параллельно или последовательно. Приостановка выполнения процесса не допускается. Процесс B зависит от процесса A, если для выполнения B нужны результаты A; тогда они выполняются только последовательно.

Таблица в файле: ID процесса, время его выполнения в миллисекундах, ID процессов, от которых он зависит, через «;». Если процесс независимый, в таблице указано значение 0.

Определите максимальное количество процессов, которые параллельно выполняются на 7-й мс. Считать, что каждый процесс начинается в самое раннее допустимое время. Нумерация миллисекунд начинается с 1.

Типовой пример из условия:

ID процесса BВремя выполнения (мс)ID процесса(-ов) A
130
241
322; 4
450
581; 4
631

Для этой таблицы процесс 3 начинается на 8-й мс и заканчивается на 9-й. Ответ ФИПИ для файла демо: 8.

Расписание: когда процесс стартует и заканчивается

Каждый процесс стартует, как только закончился последний из тех, от кого он зависит, а независимые — в нулевой момент. Время окончания — старт плюс длительность. Если старт процесса — момент 7 (то есть предшественники закончились к концу 7-й мс), а длительность 2, то он занимает 8-ю и 9-ю миллисекунды: с begin + 1 по finish включительно.

Типовой пример из условия целиком:

ПроцессЖдётСтарт (момент)Конец (момент)Занятые мс
1—031–3
4—051–5
21374–7
61364–6
51, 45136–13
32, 4798–9

Процесс 3 ждёт процессы 2 (конец 7) и 4 (конец 5) — старт в момент 7, занимает 8-ю и 9-ю мс, как и сказано в условии. На 7-й мс идут процессы 2 (4–7) и 5 (6–13) — два процесса. На 8-й — процессы 5 и 3, тоже два.

Демо-файл: 25 процессов и 17 миллисекунд

В файле демо 25 процессов, независимых три — 17, 22 и 25. Процесс 1 длится 4 мс и ждёт процессы 3 и 25; процесс 2 длится 3 мс и ждёт 8, 6 и 15. Всё расписание укладывается в 17 мс, а число одновременно идущих процессов по миллисекундам такое:

Мс12345678910–12131415–1617
Процессов33446888775421

На 7-й мс — 8 процессов. Обрати внимание: 8 держится с 6-й по 8-ю мс, а на 5-й и 9-й уже 6 и 7. Сдвиг на одну миллисекунду в этом демо ответ не меняет, но в банке заданий k выбирают так, чтобы менял, — считай точно.

Другие вопросы на том же примере

Расписание типового примера отвечает и на вопросы прошлых лет, и на «k-ю мс» при любом k:

Мс12345678910–13
Процессов2223332221

Минимальное время выполнения всех процессов — 13 мс (конец процесса 5). Наибольшее число одновременных процессов — три, на 4–6-й мс: на 4-й и 5-й идут 2, 4 и 6, на 6-й — 2, 5 и 6. На 7-й мс — два, как посчитано выше. Один раз построив расписание, дальше меняют только вопрос.

Решение на Python

ФИПИ в инструкции называет только категории программ — текстовый редактор, редактор таблиц и системы программирования, а в опубликованных регионами перечнях ПО — сами среды Python, без сторонних библиотек. Рассчитывать на odfpy на экзамене нельзя. Прочитать .ods стандартными средствами можно (это zip-архив с XML), но неудобно, поэтому данные сначала переносят в текст: открой файл в редакторе таблиц, выдели строки с данными, скопируй и вставь в новый текстовый файл 22.txt — столбцы разделятся табуляцией. Нуль в зависимостях отбрасываем, времена считаем повторными проходами, пока не посчитаны все процессы.

K = 7

rows = []
for line in open("22.txt"):                   # строки таблицы, скопированные в текстовый файл
    cells = line.rstrip("\n").split("\t")
    if cells[0].strip().isdigit():            # пустые строки и случайный заголовок пропускаем
        rows.append(cells)

dur = {}
deps = {}
order = []
for cells in rows:
    i = int(cells[0])
    order.append(i)
    dur[i] = int(cells[1])
    deps[i] = []
    tail = cells[2].strip()
    if tail != "0":                           # 0 — независимый процесс
        for d in tail.split(";"):
            deps[i].append(int(d))

begin = {}
finish = {}
while len(finish) < len(order):               # пока не посчитаны все
    progress = False
    for i in order:
        if i in finish:
            continue
        start = 0
        ready = True
        for d in deps[i]:
            if d not in finish:
                ready = False
            elif finish[d] > start:
                start = finish[d]
        if ready:
            begin[i] = start
            finish[i] = start + dur[i]
            progress = True
    if not progress:                          # за проход ничего не посчитано — данные прочитаны неверно
        raise ValueError("не все процессы посчитаны: проверь, как прочитан файл")

count = 0
for i in order:
    if begin[i] + 1 <= K <= finish[i]:        # миллисекунды с единицы
        count += 1
print(count)                                  # 8

Цикл while — ответ на зависимости вперемешку: за первый проход посчитаются независимые процессы и те, чьи предшественники уже известны, за следующие — остальные. Если за целый проход не посчитан ни один процесс, значит, какой-то процесс потерян при чтении или в данных круг — программа остановится с ошибкой, а не зависнет.

Последняя часть — сам вопрос: процесс идёт на k-й мс, если begin + 1 <= k <= finish. Для «минимального времени всех процессов» вместо неё печатают max(finish.values()), для момента старта процесса — begin[i].

Вместо копирования лист можно сохранить из Calc в CSV («Файл → Сохранить как», формат CSV, разделитель — табуляция, потому что в зависимостях уже стоит точка с запятой) — код чтения тот же.

В кабинете и дома: чтение .ods библиотекой odfpy

В Python-панели кабинета TuteMe и на домашнем компьютере с установленным odfpy файл можно прочитать напрямую — на экзамене так не получится. Одна тонкость: LibreOffice склеивает одинаковые соседние ячейки в одну с повтором. В демо у процесса 4 номер и время равны 4 и записаны одной ячейкой, поэтому повтор нужно разворачивать — иначе процесс 4 теряется: на 7-й мс ответ случайно остаётся 8, а на 13–16-й выходит 4, 3, 1, 1 вместо 5, 4, 2, 2. Вместо блока чтения 22.txt:

from odf.opendocument import load
from odf.table import Table, TableRow, TableCell

sheet = load("demo_22.ods").spreadsheet.getElementsByType(Table)[0]
rows = []
for row in sheet.getElementsByType(TableRow):
    cells = []
    for cell in row.getElementsByType(TableCell):
        repeat = int(cell.getAttribute("numbercolumnsrepeated") or 1)
        cells += [str(cell)] * min(repeat, 3)  # разворачиваем склеенные ячейки
    if cells and cells[0].strip().isdigit():
        rows.append(cells[:3])

Дальше код тот же. Приёмы работы с таблицами на экзамене — в справочнике по Calc.

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

Сдвиг на единицу

Процесс со стартом 7 и длительностью 2 занимает 8-ю и 9-ю мс, а не 7-ю и 8-ю. Условие begin + 1 <= k <= finish — ровно про это. Проверь шаблон на типовом примере из условия: там процесс 3 должен занять 8-ю и 9-ю.

Один проход по строкам

При зависимостях вперемешку один проход оставит часть процессов без времени, а шаблон, который читает finish[d] без проверки, упадёт с KeyError. Нужен цикл while до полного заполнения.

Нуль прочитан как процесс

«0» в столбце зависимостей — независимый процесс. Если не отделить нуль до int, в зависимостях появится несуществующий процесс 0 и цикл while не закончится.

Ответ на другой вопрос

Прежние варианты спрашивали минимальное время всех процессов или сколько процессов завершатся за первые N мс. Если по привычке напечатать max(finish.values()), получится 17, а не 8. Перечитай вопрос.

Заголовок таблицы попал в данные

Первая строка листа — заголовок. Если он попал в текстовый файл, проверка isdigit() по первой клетке его пропустит и не даст int упасть на тексте.

Подборка ошибок по всем номерам — в статье Типичные ошибки на ЕГЭ по информатике.

Тайминг на экзамене

ЭтапВремя
Открыть файл, понять столбцы и k из условия1 мин
Чтение таблицы и проходы while по шаблону2 мин
Подсчёт на k-й мс, проверка на типовом примере1–2 мин
Итого4–5 мин

Спецификация отводит семь минут. Проверка на типовом примере из условия — полминуты, и она ловит сдвиг на единицу до того, как ответ ушёл в бланк.

Как тренироваться

  1. Реши пять заданий с вопросом про k-ю мс на таблицах с зависимостями вперемешку, проверяя себя ручным расписанием на 5–6 процессах.
  2. Три задания прошлых лет про минимальное время тем же шаблоном — меняется только последняя часть.
  3. Один раз посчитай миллисекунды с нуля и увидь, как уезжает ответ, — ловушка запомнится.
  4. Отработай перенос данных из таблицы в текст — на экзамене это путь для Python; чтение через odfpy в кабинете должно давать то же расписание.

Как изменились остальные номера — в обзоре ЕГЭ по информатике 2027: что изменилось; демозадание в контексте варианта — в разборе демоверсии 2027. Соседние задания с файлами-таблицами — задание 9 и задание 18.

Короткий итог

Задание 22 в 2027 году — та же таблица процессов, но вопрос «сколько процессов идёт на k-й мс», нуль у независимых и зависимости вперемешку. Расписание считают проходами while, миллисекунды — с единицы, процесс занимает мс с begin + 1 по finish. На демо-файле ответ 8.

Задания 22 в форме демоверсии 2027 с автопроверкой есть в TuteMe: файлы .ods с нулём у независимых, зависимости вперемешку, вопрос про k-ю миллисекунду, и k подобран так, что сдвиг на миллисекунду меняет ответ.

Попробовать бесплатно →

Частые вопросы

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

Вопрос. Таблица та же, что в демо 2026: независимый процесс помечен нулём, а процесс может ждать процессы, которые стоят ниже него в таблице (в демо 2027 процесс 1 ждёт 3 и 25). В демо 2026 спрашивали, сколько процессов могут завершиться за первые 17 мс; в 2027 — сколько выполняются параллельно на k-й миллисекунде, в демо на 7-й, ответ 8.

Как считать миллисекунды

С единицы. Процесс, который стартует, когда закончились его предшественники к моменту 7, и длится 2 мс, занимает 8-ю и 9-ю миллисекунды — так написано в самом условии демо. Если считать с нуля, ответ сдвинется, а в демо он выверен так, что число процессов на 6-й, 7-й и 8-й мс одинаково, но на 5-й и 9-й уже другое.

Что значит 0 в столбце зависимостей

Процесс независимый: у него нет предшественников, и он стартует в нулевой момент. Так было и в демо 2026. Нуль — не процесс с номером 0; при разборе таблицы такую клетку отделяют до перевода в числа.

Почему нельзя пройти по таблице один раз сверху вниз

Потому что процесс может зависеть от процесса с большим номером, который стоит в таблице ниже. В демо процесс 1 ждёт 3 и 25. Один проход посчитает время процесса 1 раньше, чем известны времена его предшественников. Нужны либо повторные проходы, пока все времена не посчитаны, либо рекурсия с кешем.

Как решать задание 22 на Python

Перенести данные из таблицы в текстовый файл — скопировать строки или сохранить лист как CSV с табуляцией: на экзамене на сторонние библиотеки вроде odfpy рассчитывать нельзя. Дальше завести словари длительностей и зависимостей, считать времена окончания проходами while, пока не посчитаны все, и посчитать процессы, у которых begin + 1 <= k <= finish. Код в статье печатает 8 на демо-файле.

Можно ли решить задание 22 в LibreOffice Calc

Можно, но неудобно. Ссылки на строки ниже сами по себе не мешают — Calc пересчитывает формулы по зависимостям, а не по порядку строк. Трудность в другом: зависимости записаны списком в одной ячейке («3;25»), и формулу «наибольшее из окончаний предшественников» по такому списку собрать трудно. В Python это один цикл, а вопрос про k-ю миллисекунду — одна строка с подсчётом.

Какие ещё вопросы встречаются в этой теме

Минимальное время выполнения всех процессов (так спрашивали в демо 2023 года — это наибольшее время окончания), сколько процессов завершатся за первые N мс (демо 2026), самый длинный отрезок, на котором одновременно идёт не менее N процессов, момент старта конкретного процесса. Расписание считается одинаково, меняется только последняя часть кода.

Сколько баллов и времени стоит задание 22

Один первичный балл, повышенный уровень, семь минут по спецификации 2027. С готовым шаблоном чтения файла и проходов while решение занимает три-четыре минуты; ловушка сдвига на единицу стоит балла, поэтому проверь на примере из условия.

Готов применять на практике?

В тренажёре TuteMe — 1250 заданий ЕГЭ по информатике с автоматической проверкой и подробным разбором. AI-помощник подсказывает, где ты ошибаешься, и подбирает задания под твой уровень.

Начать бесплатно →

Не пишешь код? Курс «Python для ЕГЭ» — с нуля, первые два модуля бесплатно.