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