Подготовка к школе
1 класс
2 класс
3 класс
4 класс
5 класс
6 класс
7 класс
8 класс
9 класс
10 класс
11 класс
ОГЭ
ЕГЭ
Для всех
Назад

26. Прикладная задача: #298085

Сообщить о проблеме
Задание #298085
Задание было решено верно
Задание было решено неверно

Сервер выполняет запросы на передачу данных, при этом сведения о каждом выполненном запросе (время регистрации, идентификатор клиента и объём переданных данных) сохраняются в журнале работы, а сам запрос – в специальном разделе памяти сервера, имеющем ограниченный объём. Каждый раз, когда в специальном разделе остаётся недостаточно свободной памяти, сервер создаёт резервную копию всех накопленных там данных, после чего освобождает раздел и продолжает выполнение запросов. Напишите программу для обработки журнала работы сервера и с её помощью определите наибольший суммарный объём данных, переданных на сервер с двух клиентских устройств, а также объём последней по времени резервной копии специального раздела (в Кбайт), выполненной не позднее $11{:}59{:}59$.

Входные данные

Первая строка входного файла (журнала работы сервера) содержит два натуральных числа: $N$ ($N < 1000000$) – количество строк в журнале и $K$ ($K < 1000000$) – вместимость специального раздела памяти сервера в Кбайт. Каждая из следующих $N$ строк содержит информацию об одном выполненном запросе: время регистрации запроса в формате ЧЧ:ММ:СС (часы, минуты, секунды) и два натуральных числа: $C$ ($C < 1000000$) – идентификатор клиентского устройства и $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$ (в объёме $130000$ Кбайт), в $07{:}07{:}07$ (в объёме $90000$ Кбайт), в $21{:}21{:}21$ (в объёме $122000$ Кбайт) и в $23{:}23{:}23$ (в объёме $120000$ Кбайт). Всего на сервер передано $596000$ Кбайт данных: $158000$, $122000$, $182000$ и $134000$ Кбайт от клиентов с идентификаторами $101$, $202$, $303$ и $404$ соответственно. Ответ для приведённого примера: $340000$ $90000$.

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

Моделирование раздела памяти прежнее. Держим счётчик накопленного объёма; если накопленное плюс новый запрос превышает вместимость $K$, сервер делает копию того, что уже лежит в разделе, обнуляет счётчик и только потом кладёт туда новый запрос. В копию попадает объём до добавления текущего запроса.

Нужна не самая большая копия, а последняя по времени среди сделанных не позднее $11{:}59{:}59$. Поскольку журнал идёт в хронологическом порядке, достаточно просто перезаписывать переменную при каждой подходящей копии — в конце в ней останется нужная. Время сравниваем прямо как строки: формат ЧЧ:ММ:СС с ведущими нулями упорядочен лексикографически так же, как хронологически.

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

from collections import defaultdict

f = open('26-25.txt')
n, K = map(int, f.readline().split())

total = defaultdict(int)
cur = 0
last_backup = 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
            last_backup = cur
        cur = 0
    cur += s
    total[int(c)] += s

top = sorted(total.values(), reverse=True)

print(top[0] + top[1], last_backup)   # 481895 21328

Проверка. В журнале $15007$ записей, вместимость раздела $23000$ Кбайт, копий получилось $1115$. Последняя до полудня сделана в $11{:}59{:}10$ в объёме $21328$ Кбайт. Два самых активных клиента — $5382$ с объёмом $246899$ Кбайт и $4637$ с $234996$, в сумме $481895$. На типовом примере из условия программа выдаёт $340000$ и $90000$.

Показать
Очки опыта 20
Спросить Зави
0 заданий сегодня

Предложить улучшение