Сейчас разберемся, какой алгоритм нужно выбрать. Рассмотрим пример, в котором уроки и их длительность отличаются от предыдущего расписания.
Сначала самые короткие:
По левой и по правой границе:
Видно, что вариант с выбором самых коротких отрезков не подходит. Выбраны всего два, а можно выбрать три. То есть используя эту стратегию, нельзя решить задачу для любых входных данных.
Разберём ещё один вариант расположения отрезков:
Упорядочивание по началу отрезка даёт нам:
Получаем ответ:
Это решение тоже не подходит. Вместо физики и химии, можно выбрать биологию, алгебру и физкультуру, ведь они не пересекаются.
В этом случае количество уроков больше.
Упорядочивание по концу отрезка даёт нам:
Итоговая расстановка:
Для приведённых примеров последний алгоритм верно решает задачу. Значит ли это, что он будет корректно работать на всех входных данных?
Докажем его корректность.
Для этого воспользуемся методом математической индукции.
Идея метода математической индукции в следующем. Сначала проверяется истинность утверждения с номером 1 — база индукции, а затем доказывается, что если верно утверждение с номером n, то верно и следующее утверждение с номером n + 1 — индукционный переход.
Вернёмся к алгоритму. Сначала убедимся в том, что оптимальных решений этой задачи может быть несколько.
Покажем, что существует оптимальное подмножество отрезков, которое содержит первый отрезок, получившийся при применении этого алгоритма.
Поменяем отрезок с минимальным значением конца на первый, выбранный нами на данном шаге алгоритма. Количество отрезков в результирующем подмножестве не изменится — то есть подмножество останется решением. Это основано на предположении, что функция f(x) оптимального решения на диапазоне от [x;+∞) — невозрастающая. Аргумент функции х — это время, начиная с которого мы ищем решение. Иными словами, если будем сдвигать направо время начала отсчёта, то отрезков больше точно не станет.
Можно сделать вывод, что существует оптимальное подмножество, содержащее первый отрезок.
На втором шаге удаляем из множества отрезков первый отрезок и все отрезки, пересекающиеся с первым.
Третий шаг — повторяем алгоритм для усечённого множества, в котором снова находим первый отрезок.
Таким образом, с помощью метода математической индукции установили, что предложенный жадный алгоритм приводит к одному из оптимальных решений задачи.
Найденный алгоритм поможет Алле выполнить просьбу учительницы. Для этого нужно:
- Выбрать урок, который завершается раньше остальных. Он будет первым в списке.
- Выбрать предмет, который начинается после окончания первого. При этом он должен заканчиваться раньше всех прочих, которые удовлетворяют первому условию. Такой урок окажется вторым в списке.
Если следовать этому алгоритму, получится верный ответ.
Рассмотрим подробнее:
Алгебра заканчивается раньше других уроков. В соответствии с выбранной стратегией она попадёт в список первой.
Вторым шагом нужно найти предмет, который начинается после 9:50 и заканчивается раньше всех таких уроков
Физика не подходит, так как она пересекается с алгеброй. Берём химию.
Физкультура не подходит, так как она начинается раньше, чем заканчивается химия. Берем биологию. Она подходит.
Получилось, что в классе пройдут уроки алгебры, химии и биологии.
Для этой задачи мы смогли найти жадное решение. Так бывает не всегда. Далее вы в этом убедитесь.