Разборы · ЕГЭ, задание 26
Задание 26 ЕГЭ по информатике: обработка данных и моделирование
Что проверяет задание
В задании 26 дан большой файл с данными (журнал, список заказов, грузов), и нужно смоделировать процесс: заполнение склада, раздела памяти, очереди. В ответе два числа. Это одно из двух заданий, оцениваемых в 2 балла: 2 балла — оба числа верны; 1 балл — числа верны, но перепутаны местами, или верно только одно число на своём месте. Всего на экзамене 29 первичных баллов за 27 заданий и 3 часа 55 минут, так что на 26 и 27 стоит оставить минимум час.
Что нужно знать
- Чтение файла: первая строка — параметры (N, K), дальше N строк данных.
- Время вида ЧЧ:ММ:СС удобно переводить в секунды: так его можно сравнивать и сортировать как число.
- Словарь
total[key] = total.get(key, 0) + valueкопит суммы по ключу;max(total, key=total.get)— ключ с наибольшей суммой. - Если данные в файле не упорядочены, их сортируют перед моделированием.
Как решать
- Внимательно разберите типовой пример из условия и проверьте программу на нём — там ответ известен.
- Смоделируйте процесс строго по тексту: что происходит, когда очередной запрос не помещается.
- Ответьте на оба вопроса. Если второй не получается, запишите хотя бы первое число на своё место — это 1 балл.
Пример из демоверсии 2027
Сервер записывает данные запросов в раздел памяти объёмом K Кбайт. Когда очередной запрос не помещается, сервер делает резервную копию всех накопленных данных, очищает раздел и продолжает. В журнале — время, ID клиента и объём каждого запроса. Найдите ID клиента, передавшего наибольший общий объём, и сумму объёмов двух наибольших резервных копий, созданных не позднее 11:59:59.
f = open("26.txt")
n, k = map(int, f.readline().split())
log = []
for _ in range(n):
t, client, size = f.readline().split()
h, m, s = map(int, t.split(":"))
log.append((h * 3600 + m * 60 + s, int(client), int(size)))
log.sort(key=lambda r: r[0]) # по времени
total = {}
used = 0
backups = [] # (время копии, объём)
for t, client, size in log:
total[client] = total.get(client, 0) + size
if used + size > k: # не помещается — копия и очистка
backups.append((t, used))
used = 0
used += size
top = max(total, key=total.get)
limit = 11 * 3600 + 59 * 60 + 59
early = sorted((v for t, v in backups if t <= limit), reverse=True)
print(top, early[0] + early[1])
На типовом примере из условия (K = 140 000, восемь запросов) программа выдаёт 303 220000 — как в условии. Для файла демоверсии ответ — 7040 52204.
Внимание: файл демоверсии 2027 по формату не совпадает с описанием: это выгрузка таблицы в кодировке Windows-1251, первая строка — заголовки столбцов, а вместимость раздела K записана во второй строке после слова «диск». Перед решением всегда открывайте файл и смотрите на первые строки глазами, а чтение подстраивайте под то, что видите.
Типичные ошибки
- Сравнивают время как строки: «9:00:00» > «10:00:00» в строковом сравнении.
- Делают резервную копию, когда раздел заполнен ровно до K, хотя запрос ещё помещается.
- Время копии берут по предыдущему запросу, а не по тому, который не поместился.
- Не проверяют программу на примере из условия.
Потренироваться: задание 26 новые варианты с проверкой ответа