Сервер выполняет запросы на передачу данных, при этом сведения о каждом выполненном запросе (время регистрации, идентификатор клиента и объём переданных данных) сохраняются в журнале работы, а сам запрос - в специальном разделе памяти сервера, имеющем ограниченный объём. Каждый раз, когда в специальном разделе остаётся недостаточно свободной памяти, сервер создаёт резервную копию всех накопленных там данных, после чего освобождает раздел и продолжает выполнение запросов. Напишите программу для обработки журнала работы сервера и с её помощью определите идентификатор клиентского устройства, с которого на сервер был передан наибольший суммарный объём данных не позднее \(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\) Кбайт от клиентов с идентификаторами \(101, \, 202, \, 303\) и \(404\) соответственно. Ответ для приведённого примера: \(101 \,\,252000.\)
Типовой пример имеет иллюстративный характер. Для выполнения задания используйте данные из прилагаемого файла.
Решение:
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)))
requests = sorted(requests, key=lambda r: r[0])
clients = {}
reserve = []
spec = 0
for req in requests:
if spec + req[2] > K:
reserve.append(spec)
spec = req[2]
else:
spec += req[2]
if req[0] <= '12:00:00':
clients[req[1]] = clients.get(req[1], 0) + req[2]
mx = max(clients.values())
mx_client = [k for k in clients if clients[k] == mx]
reserve.sort()
print(mx_client[0], sum(reserve[-2:]))
Ответ: \(9517 \,\, 46436\)
Эффективно готовьтесь к ЕГЭ по информатике с новым тренажёром, эмулирующем работу станции КЕГЭ, которая используется на реальном экзамене