Проблема идет так (перевод):
В нижней части горы есть n (n <= 25000) человек, и каждый хочет подняться, затем вниз по горе. Есть 2 гида: один, помогающий человеку подняться на гору, один из которых помогает человеку спуститься. Человек, я занимаю (i) время, чтобы подняться на эту гору, и вниз (i) время, чтобы спуститься. Тем не менее, каждый гид может помочь только одному человеку за раз (что означает, что максимум 1 человек может подниматься, и максимум 1 человек может спускаться по горам в любой момент времени). Предположим, что, когда верхний гид достигает вершины, он мгновенно телепортируется назад, как с помощью "вниз". Найдите наименьшее время, необходимое для того, чтобы поднять всех и спуститься с горы. (Люди могут собираться на вершине горы, если это необходимо)
Здесь пример ввода для проблемы с аннотациями:
3 persons
person 1: up=6 minutes, down=4 minutes
person 2: up=8 minutes, down=1 minutes
person 3: up=2 minutes, down=3 minutes
Выход на вход:
Минимальное время составляет 17. Это происходит потому, что если человек 3 идет первым, то человек 1, а затем человек 2 (и этот же порядок используется как для восхождения, так и для спуска), это дает общее время 17.
Я пробовал придумать несколько алгоритмов, но вот что у меня до сих пор:
Алгоритм O (n! * n): просто переставьте коров через все возможные перестановки, используя next_permutation
Жадный алгоритм: я отсортировал людей, уменьшив нисходящее время и попытался объединить их, но это не привело к правильному решению.
Другие мысли
Теперь я перехожу к динамическому программированию, так как согласно CLR проблемы оптимизации обычно являются жадным или динамическим программированием (эта проблема, я думаю, удовлетворяет оптимальной субструктуре).
Я заметил, что в минимальном решении руководство "вверх" не будет отдыхать, пока все не встанут на гору. (Таким образом, нет пробелов между лицом 1, восхождение на человека и т.д.). Может быть, проблема может быть сведена к простому сокращению разрывов между временами спуска?
У меня возникли проблемы с представлением состояния для этой проблемы динамического программирования (я не думаю, что это одномерное, потому что я не думаю, что вы можете найти оптимальное решение для человека, просто зная оптимальное решение для i- 1 человек).
Может ли кто-нибудь помочь?