Тема 26. Обработка целочисленной информации с использованием сортировки

26.09 Прочие прототипы

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела обработка целочисленной информации с использованием сортировки
Решаем задачу:

Ошибка.
Попробуйте повторить позже

Задача 1#119551

Входной файл содержит сведения о заявках на бронирование помещения для проведения консультаций. Каждая заявка содержит время начала и окончания консультации (в минутах от начала суток), а также сумму, которую готовы заплатить за проведение консультации. Два мероприятия можно провести, если время окончания одного меньше или равно времени начала другого.

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

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

В первой строке входного файла — натуральное число N  (1 ≤ N ≤ 1000  ) —количество заявок. В каждой из следующих N  строк записаны три числа: время начала и окончания консультации (в минутах от начала суток, от    1  до 1440  ) и сумма оплаты.

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

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

Пример входного файла:

5

10  60  5

60  100  6

110  150  7

160  200  8

100  180  15

Максимальный доход достигается при выборе заявок 1  , 2  , 5  . Общая продолжительность: (60− 10 +1) +(100− 60 + 1)+ (180 − 100 + 1) = 173  . Ответ: 26  173  .

Вложения к задаче
Показать ответ и решение
f = open(’26_3.txt’)
n = int(f.readline())
requests = sorted([list(map(int, line.split())) for line in f])
max_profit = [0] * 1441
total_duration = [0] * 1441

for start, end, payment in requests:
    max_prev_profit = max(max_profit[:start + 1])
    time_min = 10 ** 10
    for i in range(start + 1):
        if max_profit[i] == max_prev_profit:
            if total_duration[i] < time_min:
                time_min = total_duration[i]
                time_with_max_profit = i
    new_profit = max_prev_profit + payment
    if new_profit > max_profit[end]:
        max_profit[end] = new_profit
        current_duration = end - start + 1
        total_duration[end] = current_duration + total_duration[time_with_max_profit]
    elif new_profit == max_profit[end]:
        current_duration = end - start + 1
        if current_duration < total_duration[end]:
            total_duration[end] = current_duration + total_duration[time_with_max_profit]
final_profit = max(max_profit)
final_time = total_duration[max_profit.index(final_profit)]
print(final_profit, final_time)

Ответ: 629 969

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение

Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты

Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей

Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ

Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!