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