т.к. требуется всего 2 сортировки (по времени и по стоимости)
Я тоже не понял как с двумя сортировками.
Подробнее. Алгоритм жадный - мы должны отсортировать работы в список, из которого берём их по одному последовательно. Работы берём в порядке убывания стоимости, работы одинаковой стоимости берём в порядке возрастания дедлайна, порядок работ одной стоимости с одинаковым дедлайном нам не важен. Это одна сортировка, которая, к тому же, может быть и неустойчивой. Какой-нибудь qsort для случайных входных данных вполне подойдёт, если преподаватель не слишком злой.
Отсортировав работы, мы распределяем эти работы по дням. Берём очередную работу из списка и распределяем её в
наиболее поздний свободный день перед дедлайном. Но день перед дедлайном уже может быть занят ранее распределёнными работами. И дни перед ним. И нужно быстро найти по дедлайну ближайший свободный день перед отрезком занятых дней, которому принадлежит день перед дедлайном. Для этого храним массив с лесом занятых дней, в котором непрерывные последовательности занятых дней объединены в одно дерево. По каждому дню храним день его предка в дереве. Распределяя очередную работу, берём день перед дедлайном и ищем, какому дереву-интервалу он соответствет. При поиске корня дерева не забываем путь сжимать. После добавления новой работы в свободный день объединяем этот занятый день с множествами-деревьями слева и справа от него, если интервалы слились. Вы правильно подсказали сделать корнем дерева первый свободный день слева от занятого интервала. Тогда вообще ещё проще: каждому свободному дню соответствует одно дерево в этом лесу, первоначально в массиве предков инициализируем каждый элемент своим собственным индексом, а у самого левого занятого интервала корень дерева делаем фиктивным, например, с индексом -1. Если очередная распределяемая работа попала в этот интервал, её выкидываем.
А как решить задачу со второй сортировкой?
UPD Хотя нет, сорри, я налажал. Объединять деревья нужно по рангам, добавляя меньшее дерево к большему. То есть, для каждого дерева нужно хранить ещё и его ранг (длину интервала), и корень дерева мы не можем выбирать произвольно, так как меньшее дерево нужно добавлять к большему. В корне индекс предка, действительно, можно переиспользовать в качестве дополнительной связанной с деревом информации - индекса свободного элемента слева от интервала, но это уже не принципиально.