Ich benötige Hilfe bei diesem ACM-ICPC-Problem. Meine aktuelle Idee ist es, dies als Problem mit dem kürzesten Weg zu modellieren, das unter der Problemstellung beschrieben wird.
Problem
Es gibt N = 1000
Kernabfallbehälter befindet sich entlang einer 1-D - Nummer Linie an unterschiedlichen Positionen aus -500,000 to 500,000
, mit der Ausnahme x=0
. Eine Person muss alle Mülleimer einsammeln. In jeder Sekunde, in der ein Abfallbehälter nicht eingesammelt wird, strahlt er 1 Einheit Strahlung aus. Die Person beginnt bei x = 0
und kann die 1
Einheit jede Sekunde bewegen , und das Sammeln des Abfalls dauert vernachlässigbar lange. Wir wollen die minimale Menge an Strahlung finden, die beim Sammeln aller Behälter freigesetzt wird.
Beispiel Input:
4
Container befinden sich bei [-12, -2, 3, 7]
.
Die beste Reihenfolge, um diese Container zu sammeln, ist [-2, 3, 7, -12]
eine minimale Emission von 50
Einheiten. Erklärung: Die Person geht -2
in 2 Sekunden zu und während dieser Zeit wird 2 units
Strahlung abgegeben. Dann geht er zu 3
(distance:), 5
so dass der Lauf 2 + 5 = 7
Strahlungseinheiten freigesetzt hat . Er braucht 4
mehr Sekunden, um dorthin zu gelangen, x = 7
wo das Fass 2 + 5 + 4 = 11
Einheiten abgegeben hat . Er braucht 19
Sekunden, um dorthin zu gelangen, x = -12
wo das Fass 2 + 5 + 4 + 19 = 30
Einheiten abgegeben hat . 2 + 7 + 11 + 30 = 50
, das ist die Antwort.
Anmerkungen
Es gibt eine offensichtliche O(N!)
Lösung. Ich habe mich jedoch mit gierigen Methoden befasst, wie zum Beispiel dem nächstgelegenen oder dem nächstgelegenen Cluster, aber diese haben nicht funktioniert.
Ich habe über dieses Problem eine ganze Weile nachgedacht und es als Grafiksuchproblem modelliert:
- Wir fügen
0
als Basisposition ein (Dies wird der Ausgangszustand sein) - Dann sortieren wir die Positionen vom kleinsten zum größten.
- Wir machen dann ein BFS / PFS, aus dem das
state
besteht- Zwei Ganzzahlen
l
undr
diese repräsentieren einen zusammenhängenden Bereich in dem sortierten Positionsarray, das wir bereits besucht haben - Eine Ganzzahl
loc
, die angibt, ob wir uns am linken oder am rechten Endpunkt des Bereichs befinden - Eine Ganzzahl
time
, die die verstrichene Zeit angibt - Eine Ganzzahl 'cost', die die Gesamtkosten angibt (basierend auf den von uns besuchten Knoten)
- Zwei Ganzzahlen
- Aus jedem Zustand können wir zu [l - 1, r] und [l, r + 1] wechseln und die anderen 3 Ganzzahlen entsprechend anpassen
- Der Endzustand ist [0, N] und überprüft beide Endpositionen.
Es scheint jedoch, dass [L, R, loc]
ein Zustand nicht eindeutig definiert wird, und wir müssen ihn speichern L, R, loc, and time
, während wir ihn cost
bei jedem einzelnen minimieren . Dies führt zu einem exponentiellen Algorithmus, der für alles Gute immer noch viel zu langsam ist.
Kann mir jemand helfen, meine Idee zu erweitern oder in die richtige Richtung zu lenken?
Bearbeiten: Vielleicht kann dies als Problem der Optimierung der dynamischen Programmierung modelliert werden? Wenn man darüber nachdenkt, hat es die gleichen Probleme wie die Graphensuchlösung - nur weil der Strom cost
niedrig ist, bedeutet dies nicht, dass es die optimale Antwort für dieses Unterproblem ist, da dies time
auch die Antwort stark beeinflusst.
Gierig funktioniert nicht: Ich habe einen Algorithmus für die gierige Auswahl, mit dem die Kosten für den Umzug an einen bestimmten Ort geschätzt werden (z. B. verdoppeln wir die Entfernung zu den linken Fässern und dergleichen, wenn wir uns nach rechts bewegen).
Könnten Sie eine Priority-First-Suche mit einer Heuristik durchführen? Die Heuristik kann die Kosten der aktuellen Reise mit der verstrichenen Zeit kombinieren.