J'ai besoin d'aide sur ce problème ACM ICPC. Mon idée actuelle est de modéliser cela comme un problème de chemin le plus court, qui est décrit sous l'énoncé du problème.
Problème
Il y a N = 1000
des conteneurs de déchets nucléaires situés le long d'une ligne numérique 1-D à des positions distinctes de -500,000 to 500,000
, sauf x=0
. Une personne est chargée de collecter toutes les poubelles. Chaque seconde où un conteneur à déchets n'est pas collecté, il émet 1 unité de rayonnement. La personne commence x = 0
et peut déplacer l' 1
unité à chaque seconde, et la collecte des déchets prend un temps négligeable. Nous voulons trouver la quantité minimale de rayonnement libérée lors de la collecte de tous les conteneurs.
Exemple d'entrée:
4
Conteneurs situés à [-12, -2, 3, 7]
.
Le meilleur ordre pour collecter ces conteneurs est [-2, 3, 7, -12]
, pour un minimum d'émission d' 50
unités. Explication: la personne passe -2
en 2 secondes et pendant ce temps 2 units
des radiations sont émises. Il se rend ensuite à 3
(distance:) 5
pour que le baril libère des 2 + 5 = 7
unités de rayonnement. Il prend 4
plus de secondes pour arriver x = 7
là où ce baril a émis des 2 + 5 + 4 = 11
unités. Il prend 19
quelques secondes pour arriver x = -12
là où ce baril a émis des 2 + 5 + 4 + 19 = 30
unités. 2 + 7 + 11 + 30 = 50
, qui est la réponse.
Remarques
Il existe une O(N!)
solution évidente . Cependant, j'ai exploré des méthodes gourmandes telles que passer à la plus proche ou passer au cluster le plus proche, mais celles-ci n'ont pas fonctionné.
J'ai réfléchi à ce problème pendant un bon moment et je l'ai modélisé comme un problème de recherche de graphique:
- Nous insérons
0
comme position de base (ce sera l'état initial) - Ensuite, nous trions les positions du plus petit au plus grand.
- Nous faisons ensuite un BFS / PFS, où le se
state
compose de- Deux entiers
l
etr
qui représentent une plage contiguë dans le tableau de position trié que nous avons déjà visité - Un entier
loc
qui nous indique si nous sommes sur l'extrémité gauche ou droite de la plage - Un entier
time
qui nous indique le temps écoulé - Un «coût» entier qui nous indique le coût total jusqu'à présent (basé sur les nœuds que nous avons visités)
- Deux entiers
- De chaque état, nous pouvons passer à [l - 1, r] et [l, r + 1], en ajustant les 3 autres entiers en conséquence
- L'état final est [0, N], vérifiant les deux positions finales.
Cependant, il semble que [L, R, loc]
ne définit pas uniquement un état, et nous devons stocker L, R, loc, and time
, tout en minimisant cost
à chacun de ces derniers. Cela conduit à un algorithme exponentiel, qui est encore beaucoup trop lent pour tout bien.
Quelqu'un peut-il m'aider à développer mon idée ou à la pousser dans la bonne direction?
Edit: Peut-être que cela peut être modélisé comme un problème d'optimisation de programmation dynamique? En y réfléchissant, il a les mêmes problèmes que la solution de recherche de graphiques - ce n'est pas parce que le courant cost
est faible que c'est la réponse optimale à ce sous-problème, car cela time
affecte également considérablement la réponse.
Greedy ne fonctionne pas: j'ai un algorithme de sélection gourmand qui estime le coût du déplacement vers un certain endroit (par exemple, si nous nous déplaçons à droite, nous doublons les distances vers les barils de gauche et autres).
Pourriez-vous faire une recherche prioritaire, avec une heuristique? L'heuristique pourrait combiner le coût du voyage en cours avec le temps écoulé.