Сервер выполняет запросы на передачу данных, при этом сведения о каждом выполненном запросе (время регистрации, идентификатор клиента, объём переданных данных) сохраняются в журнале работы, а переданные данные - в специальном разделе памяти сервера, имеющем ограниченный объём. Каждый раз, когда остаётся недостаточно свободной памяти, сервер создаёт резервную копию всех накопленных там данных, после чего освобождает раздел и продолжает выполнение запросов.
Напишите программу для обработки журнала работы сервера и с её помощью определите сумму идентификаторов двух клиентских устройств, с которых на сервер был передан наименьший общий объём данных, а также сумму объёмов (в Кбайт) двух последних по времени резервных копий специального раздела, выполненных не позднее \(11{:}59{:}59.\)
Входные данные
Первая строка входного файла (журнала работы сервера) содержит два натуральных числа: \(N\) \((N < 1~000~000)\) — количество строк в журнале и \(K\) \((K < 1~000~000)\) — вместимость специального раздела памяти сервера в Кбайт. Каждая из следующих \(N\) строк содержит информацию об одном выполненном запросе: время регистрации запроса в формате ЧЧ:ММ:СС (часы, минуты, секунды), а также два натуральных числа: \(C\) \((C < 1~000~000)\) — идентификатор клиентского устройства и \(S\) \((S < K)\) — объём данных запроса в Кбайт.
Выходные данные
В ответе запишите два числа: сначала сумму идентификаторов двух устройств, с которых на сервер был передан наименьший общий объём данных, а затем сумму объёмов (в Кбайт) двух последних по времени резервных копий специального раздела, выполненных не позднее \(11{:}59{:}59.\)
Типовой пример организации данных во входном файле
\(8 \,\, 140000\)
\(01{:}01{:}01 \,\, 101 \,\, 20000\)
\(03{:}03{:}03 \,\, 202 \,\, 110000\)
\(05{:}05{:}05 \,\, 101 \,\, 90000\)
\(07{:}07{:}07 \,\, 303 \,\, 62000\)
\(10{:}10{:}10 \,\, 101 \,\, 48000\)
\(15{:}15{:}15 \,\, 202 \,\, 12000\)
\(21{:}21{:}21 \,\, 303 \,\, 120000\)
\(23{:}23{:}23 \,\, 404 \,\, 134000\)
При таких исходных данных резервное копирование специального раздела выполняется четыре раза: в \(05{:}05{:}05\) (в объёме \(130~000\) Кбайт), в \(07{:}07{:}07\) (в объёме \(90~000\) Кбайт), в \(21{:}21{:}21\) (в объёме \(122~000\) Кбайт) и в \(23{:}23{:}23\) (в объёме \(120~000\) Кбайт).
Всего на сервер должно быть передано \(596~000\) Кбайт данных: \(158~000, \, 122~000, \, 182~000\) и \(134~000\) Кбайт от клиентов с идентификаторами \(107, \, 202, \, 303\) и \(404\) соответственно. Ответ для приведённого примера: \(606 \,\, 220~000.\)
Типовой пример имеет иллюстративный характер. Для выполнения задания используйте данные из прилагаемого файла.
Решение:
Python
fd = open('26.txt')
N, K = map(int, fd.readline().split())
requests = []
for line in fd:
t, c, s = line.split()
requests.append((t, int(c), int(s)))
clients = {}
reserve = []
V = 0
for req in requests:
clients[req[1]] = clients.get(req[1], 0) + req[2]
if req[0] < '12:00:00':
if V + req[2] > K:
reserve.append(V)
V = req[2]
else:
V += req[2]
cl = [v for v in clients.values()]
cl.sort()
cl_key = [k for k in clients if clients[k] in cl[:2]]
print(sum(cl_key), sum(reserve[-2:]))
Ответ: \(17248 \,\, 43147\)
Эффективно готовьтесь к ЕГЭ по информатике с новым тренажёром, эмулирующем работу станции КЕГЭ, которая используется на реальном экзамене