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

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

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

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

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

В первой строке входного файла находится натуральное число $N$ ($N \le 1000$) – количество заявок на проведение мероприятий. Следующие $N$ строк содержат пары чисел, обозначающих время начала и время окончания мероприятий. Каждое из чисел натуральное, не превосходящее $1440$.

Запишите в ответе два числа: максимальное количество мероприятий и самое позднее время окончания последнего мероприятия (в минутах от начала суток).

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

5
10 150
100 110
131 170
131 180
120 130

При таких исходных данных можно провести максимум три мероприятия, например, по заявкам $2$, $3$ и $5$. Конференц-зал освободится самое позднее на $180$-й минуте, если состоятся мероприятия по заявкам $2$, $4$ и $5$.

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

Но второй вопрос жадность не решает. Расписаний с максимальным количеством мероприятий много, и то, которое строит жадность, заканчивается раньше остальных — она специально выбирает самые ранние концы. Здесь же нужно самое позднее окончание среди всех оптимальных расписаний.

Поэтому считаем динамику: для каждого мероприятия $i$ находим $cnt[i]$ — сколько мероприятий максимум умещается в цепочке, которая заканчивается именно этим. Максимум по всем $cnt$ даёт ответ на первый вопрос, обозначим его $K$. Затем среди всех мероприятий с $cnt[i] = K$ берём наибольшее время окончания: каждое такое мероприятие может оказаться последним в некотором оптимальном расписании.

f = open('26-21.txt')
n = int(f.readline())
ev = [tuple(map(int, f.readline().split())) for _ in range(n)]
ev.sort(key=lambda x: x[1])                  # по времени окончания

cnt = [0] * n            # макс. число мероприятий в цепочке, кончающейся i-м
for i, (a, b) in enumerate(ev):
    best = 0
    for k in range(i):
        if ev[k][1] <= a and cnt[k] > best:   # конец не позже начала
            best = cnt[k]
    cnt[i] = best + 1

K = max(cnt)
last = max(b for (a, b), c in zip(ev, cnt) if c == K)

print(K, last)   # 19 1362

Проверка. Заявок $912$, жадный подсчёт тоже даёт $19$ мероприятий, но его расписание освобождает зал уже на $1088$-й минуте — почти на пять часов раньше найденного оптимума. При этом $1362$ меньше, чем самое позднее окончание в файле вообще ($1400$): то мероприятие в цепочку из $19$ штук не встраивается. На типовом примере из условия программа выдаёт $3$ и $180$.

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

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