Мне нужна помощь по этой проблеме ACM ICPC. Моя текущая идея состоит в том, чтобы смоделировать это как задачу кратчайшего пути, которая описана в формулировке проблемы.
проблема
Есть N = 1000
контейнеры ядерных отходов , расположенных вдоль числовой прямой 1-D в различных позициях от -500,000 to 500,000
, за исключением x=0
. Человеку поручено собрать все мусорные баки. Каждую секунду, когда контейнер для отходов не собирается, он излучает 1 единицу излучения. Человек начинает с x = 0
и может перемещать 1
юнит каждую секунду, а сбор отходов занимает незначительное количество времени. Мы хотим найти минимальное количество радиации, выделяемой при сборе всех контейнеров.
Пример ввода:
4
Контейнеры расположены по адресу [-12, -2, 3, 7]
.
Наилучший порядок сбора этих контейнеров - [-2, 3, 7, -12]
минимальное количество 50
единиц. Пояснение: человек идет -2
через 2 секунды и за это время 2 units
излучение испускается. Затем он идет 3
(расстояние 5
:), чтобы ствол выпустил 2 + 5 = 7
единицы излучения. Ему требуется 4
больше секунд, чтобы добраться туда, x = 7
где этот ствол испустил 2 + 5 + 4 = 11
юниты. Ему нужны 19
секунды, чтобы добраться туда, x = -12
где этот ствол испустил 2 + 5 + 4 + 19 = 30
юниты. 2 + 7 + 11 + 30 = 50
, который является ответом.
Примечания
Есть очевидное O(N!)
решение. Однако я исследовал жадные методы, такие как переход к ближайшему или переход к ближайшему кластеру, но они не сработали.
Я долго думал об этой проблеме, и смоделировал ее как проблему поиска графа:
- Мы вставляем
0
в качестве базовой позиции (это будет начальное состояние) - Затем мы сортируем позиции от наименьшего к наибольшему.
- Затем мы делаем BFS / PFS, где
state
состоит из- Два целых числа ,
l
иr
которые представляют собой непрерывный диапазон в отсортированном массиве позиции , которые мы посетили уже - Целое число,
loc
которое говорит нам, находимся ли мы в левой или правой конечной точке диапазона - Целое число,
time
которое сообщает нам прошедшее время - Целочисленная «стоимость», которая сообщает нам общую стоимость (на основе посещенных нами узлов)
- Два целых числа ,
- Из каждого состояния мы можем перейти к [l - 1, r] и [l, r + 1], соответственно настраивая остальные 3 целых числа
- Конечное состояние - [0, N], проверяя обе конечные позиции.
Тем не менее, кажется, что [L, R, loc]
это не однозначно определяет состояние, и мы должны хранить L, R, loc, and time
, минимизируя cost
при каждом из них. Это приводит к экспоненциальному алгоритму, который все еще слишком медленный для пользы.
Может ли кто-нибудь помочь мне расширить мою идею или подтолкнуть меня в правильном направлении?
Редактировать: Может быть, это может быть смоделировано как проблема оптимизации динамического программирования? Размышляя об этом, он имеет те же проблемы, что и решение для поиска в графике - просто потому, что ток cost
низкий, не означает, что он является оптимальным ответом для этой подзадачи, так как он time
также сильно влияет на ответ.
Жадность не работает: у меня есть жадный алгоритм выбора, который оценивает стоимость перемещения в определенное место (например, если мы движемся вправо, мы удваиваем расстояния до левых стволов и тому подобное).
Не могли бы вы сделать приоритетный поиск с эвристикой? Эвристика может объединять стоимость текущей поездки с количеством прошедшего времени.