Задание EGEINFA4B351: Сортировка, отбор и моделирование

ФИПИ · ЕГЭ · все форматы ответа · 2475 заданий

Открыть решение ↓ Ошибка или пожелание

Тип задачи: Сортировка, отбор и моделирование.

Учебные темы: Массивы и последовательности чисел. Вычисление обобщённых характеристик элементов массива или числовой последовательности (суммы, произведения, среднего арифметического, минимального и максимального элементов, количества элементов, удовлетворяющих заданному условию). Линейный поиск заданного значения в массиве. Алгоритмы работы с элементами массива с однократным просмотром массива. Сортировка одномерного массива. Простые методы сортировки (метод пузырька, метод выбора, сортировка вставками). Сортировка слиянием. Быстрая сортировка массива (алгоритм QuickSort). Двоичный поиск в отсортированном массиве.

Впишите правильный ответ.

Рисунок из условия ФИПИ

 

Задание выполняется с использованием прилагаемых файлов.

 

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

 

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

Первая строка входного файла (журнала работы сервера) содержит два натуральных числа: N (N < 1 000 000) – количество строк
в журнале и K (K < 1 000 000) – вместимость специального раздела памяти сервера в Кбайт. Каждая из следующих N строк содержит информацию об одном выполненном запросе: время регистрации запроса в формате ЧЧ:ММ:СС (часы, минуты, секунды) и два натуральных числа: C (C < 1 000 000) – идентификатор клиентского устройства и S (S < K) – объём данных запроса в Кбайт.

 

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

В ответе запишите два числа: сначала идентификатор устройства,
с которого на сервер был передан наибольший суммарный объём данных, не превышающий 150 000 Кбайт, а затем сумму объёмов двух наибольших резервных копий специального раздела (в Кбайт), выполненных не ранее 12:00:00.

 

Типовой пример организации данных во входном файле

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 соответственно. Ответ для приведённого примера: 404   242 000.

 

Типовой пример имеет иллюстративный характер.
Для выполнения задания используйте данные из прилагаемого файла.

 

Рисунок из условия ФИПИ


i
СВОЙСТВА ЗАДАНИЯ
КЭС:
3.10 Массивы и последовательности чисел. Вычисление обобщённых характеристик элементов массива или числовой последовательности (суммы, произведения, среднего арифметического, минимального и максимального элементов, количества элементов, удовлетворяющих заданному условию). Линейный поиск заданного значения в массиве. Алгоритмы работы с элементами массива с однократным просмотром массива. Сортировка одномерного массива. Простые методы сортировки (метод пузырька, метод выбора, сортировка вставками). Сортировка слиянием. Быстрая сортировка массива (алгоритм QuickSort). Двоичный поиск в отсортированном массиве
Тип ответа:Краткий ответ
Номер: A4B351
НЕ РЕШЕНО Ответить

Решение задания EGEINFA4B351

Ответ: 1006 46566

Решение.
В исходном журнале N = 15003 запросов, вместимость раздела K = 23285 Кбайт. Упорядочим запросы по времени. Строки времени имеют одинаковый формат ЧЧ:ММ:СС, поэтому их обычная сортировка совпадает с хронологической.
Объёмы по клиентам и резервные копии считаем отдельно. Для каждого клиента складываем объёмы его запросов. Для раздела храним used — сумму данных, записанных после последнего освобождения.
Перед очередным запросом объёма size проверяем used + size > K. Если места не хватает, создаётся копия объёма used во время текущего запроса, затем раздел освобождается. Только после этого записывается новый запрос. Поэтому он не входит в создаваемую перед ним копию.
При used + size = K запрос помещается полностью и копия ещё не создаётся. В конце журнала оставшиеся данные сами по себе не образуют резервную копию: по условию копирование вызывается нехваткой места для следующего запроса.
До обработки первого запроса used = 0. После каждого шага used равен сумме именно тех запросов, которые находятся в разделе сейчас. Описанная проверка сохраняет этот инвариант и перечисляет все моменты копирования. Для ограничения по времени используем момент создания копии, а не время первого записанного в неё запроса.
Для первого числа используем полные суточные объёмы клиентов. Сначала исключаем устройства, передавшие больше 150000 Кбайт, затем среди оставшихся выбираем максимальный объём и записываем идентификатор этого клиента. Ограничение относится ко всей сумме клиента, а не к отдельным запросам.
Для второго числа оставляем копии, созданные в 12:00:00 или позднее, и складываем два наибольших объёма. Ровно полдень входит в этот промежуток.
Сохраните скачанный файл рядом с программой под исходным именем. Программа на Python:

with open("img1_1786621659.txt") as f:
    n, capacity = map(int, f.readline().split())
    log = []
    for line in f:
        time, client, size = line.split()
        log.append((time, int(client), int(size)))
log.sort(key=lambda row: row[0])
totals = {}
morning = {}
backups = []
used = 0
for time, client, size in log:
    totals[client] = totals.get(client, 0) + size
    if time < '12:00:00':
        morning[client] = morning.get(client, 0) + size
    if used + size > capacity:
        backups.append((time, used))
        used = 0
    used += size
eligible = [c for c in totals if totals[c] <= 150000]
first = max(eligible, key=totals.get)
sizes = sorted((size for time, size in backups if time >= '12:00:00'), reverse=True)
second = sizes[0] + sizes[1]
print(first, second)

Для первого числа отобраны клиент 1006: 148122 Кбайт. Среди подходящих устройств получен требуемый результат 1006.
Для второго числа выбраны копии 18:37:09: 23285 Кбайт; 18:09:36: 23281 Кбайт. Получаем 46566 Кбайт.
Проверка: найдено 1112 резервных копий, из них 548 до полудня и 564 начиная с полудня. В конце осталось 5477 Кбайт. Сумма объёмов всех копий и этого остатка равна сумме всех запросов 24941975 Кбайт.
Независимый расчёт использовал префиксные суммы запросов. Для каждого начала блока бинарным поиском найдена последняя граница, при которой сумма не превышает K; следующий запрос вызывает копию. Все границы блоков и объёмы совпали с пошаговой симуляцией.
Сортировка и выбор требуемых максимумов занимают O(N log N) времени; симуляция — O(N). Память для журнала, сумм и списка копий O(N).
Ответ: 1006 46566.

Помочь улучшить сайт

Напишите пожелание к сайту или решению либо сообщите о найденной неточности в задании EGEINFA4B351.

Сообщение увидит только команда сайта: на странице оно не публикуется.

Комментарии к решению

Комментарии видны всем посетителям сайта.

Комментариев пока нет. Будьте первым.

Чтобы оставить комментарий, войдите или зарегистрируйтесь.