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

Задание 26 ЕГЭ по информатике 2027: сортировка и жадный выбор

Задание 26до 2 балловсортировка и жадный выбор
Раздел
Алгоритмы и программирование
Максимальный балл
2 балла
Уровень
высокий
Что проверяет
Умение обрабатывать целочисленную информацию с использованием сортировки
Что нужно сделать
Написать программу: обработать данные из файла с сортировкой и жадным выбором и найти два числа.
Как записать ответ
два числа в две клетки таблицы ответа, в порядке из условия
Время
Около 35 минут по обобщённому плану ФИПИ
Элемент кодификатора
3.10
Компьютер
Нужна программа или электронная таблица: на станции КЕГЭ — среды программирования на C#, C++, Pascal, Java, Python и редактор таблиц
Файл к заданию
текстовый файл .txt — его читает программа
В 2026 году
Тоже задание 26

Задание 26 ЕГЭ по информатике 2027 года проверяет, по формулировке обобщённого плана ФИПИ, «умение обрабатывать целочисленную информацию с использованием сортировки». Это задание высокого уровня с приложенным файлом: нужно написать программу, которая обработает журнал или последовательность объектов и найдёт два числа. Формат файла зависит от сюжета: у журнала сервера первая строка — количество записей N и вместимость раздела памяти K в Кбайт, дальше строки «время, идентификатор клиента, объём»; у упаковки товаров — количество товаров и вместимость коробки, дальше по одному числу в строке; у расписания — количество заявок, дальше два времени в формате ЧЧ:ММ:СС.

Задание требует специализированного ПО и оценивается в 2 балла: 26 и 27 — единственные задания работы, за которые ставят больше одного балла. В 2027 году правило частичного балла уточнили: «если в ответе на задания 26, 27 верные числа в ячейках таблицы перепутаны местами или в ячейках таблицы на верном месте присутствует только одно верное число (второе неверно или отсутствует), ставится 1 балл». В 2026 году для задания 26 достаточно было наличия одного верного числа в любом из полей; теперь оно должно стоять на своём месте. По обобщённому плану ФИПИ на задание отводится около 35 минут.

Тема и формат файла в 2027 году не изменились: в спецификации сказано, что «изменения структуры КИМ отсутствуют», а среди заданий 10, 13 и 23 с новой тематикой задание 26 не названо. При этом 26 остаётся одним из самых трудных мест работы: средний процент выполнения в 2026 году — 5,6, а методические рекомендации ФИПИ приводят разбивку «группа 3 на 1 балл – 2,4 %, 2 балла – 0,75 %; группа 4 на 1 балл – 16,6 %, 2 балла – 20,0 %».

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

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

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

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

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

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

Резервные копии раздела памяти сервера

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

В файле — журнал работы сервера: в первой строке количество записей N и вместимость специального раздела памяти K в Кбайт, в каждой следующей строке время регистрации в формате ЧЧ:ММ:СС, идентификатор клиента и объём данных запроса. Нужно найти идентификатор клиента с наибольшим суммарным объёмом переданных данных (при равенстве — наименьший) и сумму двух наибольших резервных копий, созданных не позднее 11:59:59. Это тип задания из демоверсии 2027 года.

7 100
01:00:00 11 40
02:00:00 22 30
03:00:00 11 50
04:00:00 22 60
05:00:00 33 70
06:00:00 11 20
12:30:00 44 90

Для этого примера ответ — 11 130.

Задание выполняется с использованием прилагаемого файла

26.txt39 КБ

1. Первую строку читаем отдельно: N — число записей, K — вместимость раздела. 2. Ведём used — объём данных в разделе сейчас — и словарь сумм по клиентам; сумму накапливаем на каждой строке. 3. Если used + S > K, свободной памяти не хватает: объём used уходит в список копий (при времени не позже 11:59:59), раздел обнуляется, и только потом прибавляется объём запроса. 4. В конце берём клиента с наибольшей суммой (при равенстве — наименьший идентификатор) и сумму двух наибольших копий.

На примере: 40 и 30 Кбайт занимают раздел до 70; запрос на 50 не помещается — копия 70; раздел 50 + 60 снова переполняется — копия 50; запрос на 70 даёт копию 60. Две наибольшие копии — 70 и 60, их сумма 130. По клиентам: 11 передал 110 Кбайт, 22 — 90, 33 — 70, 44 — 90 — ответ 11 130.

Решение на Python
import heapq
from collections import Counter

with open('26.txt') as f:
    n, k = map(int, f.readline().split())

    total = Counter()   # суммарный объём данных по клиентам
    copies = []         # объёмы копий, созданных не позднее 11:59:59
    used = 0            # сколько данных лежит в разделе сейчас

    for _ in range(n):
        t, c, s = f.readline().split()
        c, s = int(c), int(s)
        total[c] += s
        if used + s > k:          # запрос не помещается целиком
            if t <= '11:59:59':   # время копии не позже 11:59:59
                copies.append(used)
            used = 0              # раздел освобождён, запрос начнётся в пустом
        used += s

# при равных суммах нужен наименьший идентификатор
best = max(total, key=lambda c: (total[c], -c))
print(best, sum(heapq.nlargest(2, copies)))

Ответ на приложенном файле: 2055 354545

Упаковка товаров в коробки заданной вместимости

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

В файле — массы товаров: в первой строке количество товаров N и вместимость коробки K в килограммах, дальше в каждой строке одно число. Товары берут по одному в порядке файла и укладывают в текущую коробку, пока очередной помещается; как только не помещается — коробку закрывают, берут новую и кладут товар уже в неё. Запишите, сколько коробок понадобится и какова суммарная масса двух самых тяжёлых коробок.

7 50
20
15
25
30
10
40
5

Для этого примера ответ — 4 85.

Задание выполняется с использованием прилагаемого файла

26.txt4,6 КБ

1. Из первой строки читаем N и K, дальше — по одному числу. 2. Держим массу текущей коробки load: если load + w > K, коробку закрывают (масса уходит в список), а товар кладут в новую. 3. Помещающийся товар просто прибавляется к load. 4. После последней строки закрываем последнюю коробку и добавляем её массу. 5. В ответ идут количество коробок и сумма двух наибольших масс.

На примере: товары 20 и 15 образуют коробку массой 35; товар 25 в неё не входит — начинается новая коробка, но в неё сразу же не помещается товар 30, поэтому коробку с массой 25 закрывают, а товар 30 кладут в следующую; вместе с товаром 10 эта коробка весит 40, а товар 40 её закрывает; последняя коробка — 40 + 5 = 45. Массы коробок 35, 25, 40, 45 — ответ 4 85.

Решение на Python
with open('26.txt') as f:
    n, k = map(int, f.readline().split())
    weights = [int(f.readline()) for _ in range(n)]

boxes = []      # массы уже закрытых коробок
load = 0        # масса текущей коробки
for w in weights:
    if load + w > k:    # товар не помещается — коробку закрываем
        boxes.append(load)
        load = 0
    load += w
boxes.append(load)      # последняя коробка тоже закрывается

boxes.sort(reverse=True)
print(len(boxes), boxes[0] + boxes[1])

Ответ на приложенном файле: 410 3892

Расписание: наибольшее число непересекающихся заявок

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

В файле — заявки одного исполнителя: в первой строке их количество N, дальше в каждой строке время начала и время окончания в формате ЧЧ:ММ:СС. Заявки рассматривают в порядке возрастания времени окончания и принимают каждую, время начала которой не меньше времени окончания последней принятой. Запишите количество принятых заявок и их суммарную длительность в секундах.

6
08:00:00 09:00:00
08:30:00 08:45:00
08:50:00 10:00:00
09:30:00 10:30:00
10:15:00 11:00:00
10:45:00 11:30:00

Для этого примера ответ — 3 7800.

Задание выполняется с использованием прилагаемого файла

26.txt20 КБ

1. Из первой строки читаем N, дальше — пары времён; каждое переводим в секунды: часы × 3600 + минуты × 60 + секунды. 2. Сортируем заявки по времени окончания: раньше заканчивающаяся заявка оставляет больше времени на следующие, поэтому такой выбор принимает наибольшее число заявок. 3. Держим момент освобождения busy; заявку принимаем, если её начало не меньше busy, и сдвигаем busy к её окончанию. 4. Печатаем число принятых заявок и их суммарную длительность.

На примере: первой принимается заявка 08:30:00–08:45:00; заявка 08:00:00–09:00:00 отбрасывается; далее подходят 08:50:00–10:00:00 и 10:15:00–11:00:00. Принято 3 заявки, длительности 900 + 4200 + 2700 = 7800 секунд.

Решение на Python
with open('26.txt') as f:
    n = int(f.readline())
    jobs = [f.readline().split() for _ in range(n)]


def to_seconds(t):
    h, m, s = map(int, t.split(':'))
    return h * 3600 + m * 60 + s


# упорядочиваем заявки по моменту окончания
intervals = sorted(((to_seconds(a), to_seconds(b)) for a, b in jobs),
                   key=lambda p: p[1])

count = 0     # сколько заявок принято
total = 0     # их суммарная длительность в секундах
busy = 0      # когда освободится исполнитель
for start, end in intervals:
    if start >= busy:      # заявка не пересекается с принятыми
        count += 1
        total += end - start
        busy = end

print(count, total)

Ответ на приложенном файле: 121 46529

Шаблон кода на Python

Сортировка и жадный выбор

В первой строке файла — ограничение и число записей. Сортируете по возрастанию и берёте подряд, пока влезает; второй ответ — замена последнего взятого на самый большой, который ещё влезает.

Python
with open('26.txt') as f:
    s, n = map(int, f.readline().split())
    a = sorted(int(f.readline()) for _ in range(n))

count = total = 0
for x in a:
    if total + x > s:
        break
    total += x
    count += 1

free = s - (total - a[count - 1])   # место без последнего взятого
biggest = max(x for x in a[count - 1:] if x <= free)
print(count, biggest)
Файл-пример 26.txt
100 6
40
15
30
25
60
10
Вывод на файле-примере
4 40

Шаблоны кода ко всем заданиям

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

  1. Сохраните файл задания в рабочую папку и откройте его по имени, например open('26.txt'). Первую строку читайте отдельно: в ней параметры N и K, а не данные.
  2. Разберитесь, что в строке служит разделителем. У журнала сервера и у расписания это пробел, поэтому читайте через line.split(); у упаковки в строке одно число, и хватит int(line).
  3. Решите, что копится по ходу одного прохода: текущий объём раздела, масса открытой коробки, время освобождения исполнителя. Второй проход по файлу на миллион строк не нужен.
  4. Отдельно заведите сборщики ответа: словарь сумм по идентификаторам, список найденных копий, счётчик и общую длительность. В конце возьмите из них максимум и две наибольшие величины.
  5. Проверьте программу на типовом примере из условия: она должна напечатать названный там ответ. Только после этого запускайте её на файле задания.
  6. Ответ — два целых числа через пробел, в порядке из условия. За перепутанные числа поставят только 1 балл.

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

  • Один проход с накоплением. По файлу идём слева направо и держим небольшое состояние: у сервера — объём данных в разделе, у упаковки — масса открытой коробки, у расписания — время освобождения исполнителя.
  • Жадный выбор. «Брать, пока помещается» и «принимать заявку, не пересекающуюся с предыдущей» оптимальны: порядок объектов задан, и выбор в каждой точке единственный.
  • Сброс и фиксация. При переполнении сначала закрывается текущий объект: накопленная сумма уходит в список, и только потом начинается новый. Копия создаётся перед запросом, который не помещается.
  • Сравнение времён. Строки «ЧЧ:ММ:СС» одинаковой длины с ведущими нулями сравниваются как текст; для длительности время переводят в секунды: часы × 3600 + минуты × 60 + секунды.
  • Два ответа из одного прохода. По ходу набирают всё нужное: словарь сумм, список найденных объектов, счётчик. Второй раз файл не читают.

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

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

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

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

В демоверсии 2027 года дан журнал работы сервера demo_26.txt: в первой строке 15 001 запись и вместимость раздела 26 107 Кбайт. Спрашивают идентификатор клиента с наибольшим суммарным объёмом данных и сумму двух наибольших резервных копий раздела, созданных не позднее 11:59:59. Ключ ФИПИ на этом файле — 7040 52204.

Разберём типовой пример из условия: восемь запросов при K = 140 000 Кбайт. Запросы на 20 000 и 110 000 Кбайт занимают раздел до 130 000. Запрос в 05:05:05 на 90 000 Кбайт не помещается, поэтому сервер создаёт копию на 130 000 Кбайт и начинает раздел с 90 000; запрос в 07:07:07 на 62 000 даёт вторую копию на 90 000. Дальше раздел доходит до 122 000 и переполняется ещё дважды, но эти копии появились после 11:59:59 и в сумму не входят. Две отобранные копии — 130 000 и 90 000, их сумма 220 000. Больше всех данных передал клиент 303 (182 000 Кбайт). Ответ примера — 303 220 000.

Заметьте: копия — это объём, накопившийся до запроса, вызвавшего переполнение, а не после него.

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

Копию считают после запроса

Переполнение обнаруживают уже после добавления объёма, и в копию попадает сумма вместе с вызвавшим её запросом. Правильный порядок: проверить, что used + S > K, зафиксировать used, обнулить раздел и только затем прибавить S.

Нестрогое сравнение при переполнении

Условие создания копии строгое: used + S > K. Если сумма в точности равна K, места хватает — копии нет. Знак «больше или равно» даёт лишнюю копию и неверное второе число.

Копии не ограничивают по времени

В сумму берут две наибольшие копии из всех, тогда как нужны только созданные не позднее 11:59:59. Копия, появившаяся позже, попадает в список и вытесняет нужную, поэтому второе число получается завышенным.

Заявки сортируют по времени начала

В задании о расписании заявки упорядочивают по времени окончания: раньше заканчивающаяся заявка оставляет больше времени на следующие. Сортировка по началу даёт меньше принятых заявок, а не наибольшее возможное число.

Числа в ответе стоят не на своих местах

Первым идёт идентификатор или количество, вторым — сумма. Даже если оба числа верны, но перепутаны местами, за задание ставят 1 балл, а не 2.

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

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

Написать программу, которая за один проход читает файл, копит нужные величины и печатает два числа. Вручную такое задание не решают: строк в файле до миллиона, а ответ должен полностью совпасть с эталоном.

Нужно ли писать программу для задания 26?

Да. В обобщённом плане ФИПИ у задания 26 стоит отметка о необходимости специализированного ПО, а из условия ответ не выводится: в демоверсии к заданию приложен файл на 15 001 строку.

Сколько баллов даёт задание 26 и сколько на него времени?

2 балла — столько же, сколько за задание 27, и больше, чем за любое из заданий 1–25. Если два верных числа перепутаны местами или на верном месте присутствует только одно верное число, ставят 1 балл. По обобщённому плану отводится около 35 минут, уровень сложности — высокий.

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

Изменилось правило частичного оценивания: в 2027 году одно верное число, если оно стоит не на своём месте, балла не даёт. В 2026 году для задания 26 было достаточно наличия одного верного числа в любом из двух полей. Тема и формат файла при этом прежние: «Изменения структуры КИМ отсутствуют», а среди заданий 10, 13 и 23 с новой тематикой задание 26 не названо.

Какой шаблон кода подходит для задания 26?

Один проход по строкам и несколько накопителей: словарь сумм по ключу, список найденных объектов, счётчик и итоговая длительность. В конце — максимум по словарю и две наибольшие величины из списка. Для расписания ещё нужен перевод времени в секунды.

Другие задания раздела «Алгоритмы и программирование»

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

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