Разбор задачи "E. Помощник"
Для решения задачи, во-первых, необходимо было аккуратно считать входные данные и для удобства перевести все времена, заданные в формате day, hour, minute в минуты. Это можно было сделать, используя формулу newTime = (day - 1) * 24 * 60 + hour * 60 + minute.
Во-вторых, необходимо подсчитать количество свободных для решения задач минут, имеющихся у Валеры на протяжении всей сессии. Кроме того, для каждой свободной минуты j нужно определить tj --- номер этой минуты с начала сессии.
Далее для каждого студента следует посчитать величину deadlinei --- такую наибольшую свободную минуту с начала сессии, что если Валера закончит выполнять задание в эту минуту, то он получит вознаграждение от соответствующего студента. Очевидно, что если во время сдачи экзамена i-ым студентом, Валера не будет спать или кушать, то deadlinei будет равно минуте, предшествующей началу экзамена, иначе deadlinei будет соответствовать последней свободной минуте, предшествующей сну или трапезе. Кроме того, если свободной минуты с начала сессии не найдется или Валера не сможет помочь i-ому студенту, то определим в этом случае deadlinei = -1.
Теперь отсортируем всех студентов по неубыванию величины deadline и воспользуемся методом динамического программирования. Состояниями "динамики" будут два параметра i --- количество обработанных студентов (т.е. тех, для которых задачи уже решены) и j --- номер свободной минуты, начиная с которой Валера может начать выполнять задания для очередного студента. Значением "динамики" будет максимальная прибыль, которую Валера сможет получить, достигнув соответствующего состояния.
Очевидно, возможны два перехода из состояния i, j:
- в состояние i + 1, j --- в этом случае Валера не будет решать задачи для i-го студента
- в состояние i + 1, j + time[i] (где time[i] --- время, необходимое для решения задач i-го студента) --- в этом случае Валера будет решать задачи для i-го студента, и к его прибыли прибавится вознаграждение, которое этот студент готов заплатить. Однако такой переход возможен лишь в том случае, когда t(j + time[i]) не превосходит deadlinei.
После того, как будут посчитаны значения для всех возможных i, j, ответом на задачу будет максимум в n-ой строке соответствующего массива (где n --- суммарное число студентов).
Кроме того, для восстановления ответа нужно использовать дополнительный массив предков и аккуратно переводить время обратно в требуемое представление.