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 = 1000Kernabfallbehä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 = 0und kann die 1Einheit 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:
4Container befinden sich bei [-12, -2, 3, 7].
Die beste Reihenfolge, um diese Container zu sammeln, ist [-2, 3, 7, -12]eine minimale Emission von 50Einheiten. Erklärung: Die Person geht -2in 2 Sekunden zu und während dieser Zeit wird 2 unitsStrahlung abgegeben. Dann geht er zu 3(distance:), 5so dass der Lauf 2 + 5 = 7Strahlungseinheiten freigesetzt hat . Er braucht 4mehr Sekunden, um dorthin zu gelangen, x = 7wo das Fass 2 + 5 + 4 = 11Einheiten abgegeben hat . Er braucht 19Sekunden, um dorthin zu gelangen, x = -12wo das Fass 2 + 5 + 4 + 19 = 30Einheiten 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
0als 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
statebesteht- Zwei Ganzzahlen
lundrdiese 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 costbei 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 costniedrig ist, bedeutet dies nicht, dass es die optimale Antwort für dieses Unterproblem ist, da dies timeauch 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.