Мне нужна помощь по этой проблеме 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также сильно влияет на ответ.
Жадность не работает: у меня есть жадный алгоритм выбора, который оценивает стоимость перемещения в определенное место (например, если мы движемся вправо, мы удваиваем расстояния до левых стволов и тому подобное).
Не могли бы вы сделать приоритетный поиск с эвристикой? Эвристика может объединять стоимость текущей поездки с количеством прошедшего времени.