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 = 1000des 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 = 0et peut déplacer l' 1unité à 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:
4Conteneurs situés à [-12, -2, 3, 7].
Le meilleur ordre pour collecter ces conteneurs est [-2, 3, 7, -12], pour un minimum d'émission d' 50unités. Explication: la personne passe -2en 2 secondes et pendant ce temps 2 unitsdes radiations sont émises. Il se rend ensuite à 3(distance:) 5pour que le baril libère des 2 + 5 = 7unités de rayonnement. Il prend 4plus de secondes pour arriver x = 7là où ce baril a émis des 2 + 5 + 4 = 11unités. Il prend 19quelques secondes pour arriver x = -12là où ce baril a émis des 2 + 5 + 4 + 19 = 30unité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
0comme 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
statecompose de- Deux entiers
letrqui représentent une plage contiguë dans le tableau de position trié que nous avons déjà visité - Un entier
locqui nous indique si nous sommes sur l'extrémité gauche ou droite de la plage - Un entier
timequi 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 costest faible que c'est la réponse optimale à ce sous-problème, car cela timeaffecte é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é.