Расписание кабинета

тема: Интервалы: покрытие и расписание · уровень: средний

Условие

В школе один и тот же кабинет хотят занять разные кружки. Каждый кружок прислал время начала и конца занятия.

Кабинет можно быстро проветрить, поэтому если одно занятие заканчивается ровно в момент, когда другое начинается, они не мешают друг другу.

Нужно понять, сколько занятий максимум можно провести в этом кабинете за день, если выбрать подходящий набор кружков.

Формат ввода

В первой строке дано целое число n — количество заявок. Далее в n строках даны по два целых числа s и t — начало и конец занятия.

Считайте, что занятие занимает кабинет на полуинтервале [s, t), то есть момент t уже свободен.

Формат вывода

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

Ограничения

Пример

Ввод:

5
1 4
3 5
0 6
5 7
8 9

Вывод:

3

Как решать — идея подхода

Приём: Жадный выбор по времени окончания

Ключевое наблюдение: если мы хотим провести как можно больше занятий без пересечений, «опаснее всего» оставлять кабинет занятым надолго. Поэтому среди всех занятий, которые можно поставить первыми, выгоднее выбрать то, которое заканчивается раньше всех — тогда мы оставим максимум места для остальных.

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

План решения:

Важно про полуинтервал [s, t): занятие, которое начинается ровно в момент окончания предыдущего, совместимо, поэтому условие именно s >= last_end, а не s > last_end.

Сложность: сортировка O(n log n), проход O(n). При n до 12000 это быстро.

Частая ошибка: сортировать по началу s (или выбирать самое короткое по длительности) — это ломает оптимальность; критично сортировать именно по времени окончания.

Разберись руками

Есть 5 кружков: [1,4), [3,5), [0,6), [5,7), [8,9). Если один заканчивается ровно в момент старта другого, то они совместимы (например, конец 4 и старт 4 — ок). Нужно выбрать максимум занятий без пересечений.

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

Решить задачу с автопроверкой на Python →

Куда дальше