26. Прикладная задача: #298100
Сервер выполняет запросы на передачу данных, при этом сведения о каждом выполненном запросе (время регистрации, идентификатор клиента, объём переданных данных) сохраняются в журнале работы, а переданные данные – в специальном разделе памяти сервера, имеющем ограниченный объём. Каждый раз, когда остаётся недостаточно свободной памяти, сервер создаёт резервную копию всех накопленных там данных, после чего освобождает раздел и продолжает выполнение запросов. Напишите программу обработки журнала работы сервера и определите идентификатор клиентского устройства, с которого на сервер был передан наибольший общий объём данных, а также сумму объёмов (в Кбайт) двух наибольших резервных копий специального раздела, созданных не позднее $11{:}59{:}59$.
Обе величины считаются за один проход, но ограничение по времени здесь наложено только на резервные копии — суммы по клиентам берутся за все сутки без всяких фильтров.
Моделирование раздела памяти стандартное: держим счётчик накопленного объёма, и если накопленное плюс новый запрос превышает вместимость $K$, сервер копирует то, что уже лежит в разделе, обнуляет счётчик и только потом кладёт туда новый запрос. Порядок важен: в копию попадает объём до добавления текущего запроса. В список кандидатов на две наибольшие копии берём только те, что созданы не позднее $11{:}59{:}59$. Время сравниваем прямо как строки: формат ЧЧ:ММ:СС с ведущими нулями упорядочен лексикографически так же, как хронологически.
Суммы по клиентам копим в словаре и в конце берём клиента с наибольшим значением.
from collections import defaultdict
f = open('26-30.txt')
n, K = map(int, f.readline().split())
total = defaultdict(int)
backups = []
cur = 0
for _ in range(n):
t, c, s = f.readline().split()
s = int(s)
if cur + s > K: # свободной памяти не хватает
if t <= '11:59:59': # копия создана не позднее 11:59:59
backups.append(cur)
cur = 0
cur += s
total[int(c)] += s
best = max(total, key=lambda c: total[c])
backups.sort(reverse=True)
print(best, backups[0] + backups[1]) # 7040 52204
Проверка. В журнале $15001$ запись, вместимость раздела $26107$ Кбайт. Копий всего $1072$, из них до полудня — $534$; две наибольшие оказались по $26102$ Кбайт каждая, в сумме $52204$. По клиентам лидирует устройство $7040$ с объёмом $303454$ Кбайт, следующее — $4783$ с $294379$. На типовом примере из условия программа выдаёт $303$ и $220000$.