Überblick
Ordnen Sie anhand einer Liste mit Feuerwerkskörpern a-z
und Uhrzeiten 3-78
Sicherungen an, damit alle zur richtigen Zeit aufleuchten.
Eine Eingabezeile besteht aus durch Leerzeichen getrennten Buchstaben und Zahlen:
a 3 b 6 c 6 d 8 e 9 f 9
Dieses Beispiel zeigt, dass Feuerwerk a
zur selben Zeit angezündet werden muss 3
, b
und c
zwar um 6
, d
um 8
, mit e
und f
um 9
. Jede Zeile entspricht einer Karte.
Der Ausgang ist eine Zünd- / Feuerwerkskarte für jede Zeile. Verwenden Sie die Symbole |-
, um Zündungen anzuzeigen, und die Buchstaben, um ein Feuerwerk anzuzeigen.
Eine -
Sicherung wird direkt links / rechts von Sicherungen und Feuerwerkskörpern angeschlossen, während eine |
Sicherung mit den darüber / darunter befindlichen verbunden wird. Zum Beispiel sind die Sicherungen ||
sind nicht verbunden, und -|
sind .
Zum Beispiel sind zwei mögliche Antworten auf die obigen Fragen:
---a ---------f
| ||| ||
|-c ||| de
--|--d a||
| b | |c
f e b
Alle Sicherungskarten sollten mit einer einzelnen -
in der oberen linken Ecke beginnen. Das ist der Punkt, an dem Sie die Sicherung anzünden. Jeder Sicherungscharakter benötigt eine Sekunde zum Brennen. Wie Sie sehen, a
ist das in beiden Diagrammen in drei Sekunden erreicht, b
in sechs usw.
Nun sind beide oben angegebenen Karten für die angegebenen Eingaben gültig, aber eine ist eindeutig effizienter. Der linke verwendet nur 13 Sicherungseinheiten, der rechte 20.
Sicherungen brennen nicht durch Feuerwerk! Für die Eingabe a 3 b 5
ist dies also nicht gültig:
---a--b
Herausforderung
Ihr Ziel ist es, die Menge der verwendeten Sicherungen in allen Testfällen zu minimieren. Die Bewertung ist sehr einfach, die Gesamtmenge der verwendeten Sicherungseinheiten.
Wenn Sie keine Karte für einen Testfall erstellen können , unabhängig davon, ob es sich um einen unmöglichen Fall handelt oder nicht, ist die Punktzahl für diesen Fall die Summe aller Zeiten (41 im obigen Beispiel).
Bei einem Unentschieden wird die Wertung so geändert, dass die kompaktesten Karten gewinnen. Der Tiebreak-Score ist der Bereich des Begrenzungsrahmens jeder Karte. Das heißt, die Länge der längsten Zeile multipliziert mit der Anzahl der Zeilen. Bei "unmöglichen" Karten ist dies das Quadrat der größten Zahl (81 im obigen Beispiel).
In dem Fall, dass die Einsendungen beide Bewertungsmethoden binden, geht die Bindung an den früheren Eintrag / die frühere Bearbeitung.
Ihr Programm muss zu Überprüfungszwecken deterministisch sein.
Testfälle
Es gibt 250 Testfälle, hier befindet . Jedes hat zwischen 4 und 26 Feuerwerke. Die minimale Zündzeit für ein Feuerwerk beträgt 3. Das Feuerwerk ist jeweils nach Uhrzeit und Buchstaben "sortiert", dh es b
wird nie zuvor angezündet a
.
Bitte geben Sie bei der Veröffentlichung Ihr vollständiges Programm, Ihre Gesamtpunktzahl und die resultierende Karte für (mindestens) den ersten in der Datei angegebenen Testfall an:
a 6 b 8 c 11 d 11 e 11 f 11 g 12 h 15 i 18 j 18 k 21 l 23 m 26 n 28 o 28 p 30 q 32 r 33 s 33 t 34
quelle
rand.nextInt(5)%4
also 40% Chance0
und 20% für jede1,2,3
.-+-
anstelle von---
nicht automatisch connect Feuerwerk über / unter, hat es noch sein|
unten oben / es zu einem Feuerwerk zu verbinden.-+-
anstelle von-|-
ist okay so wie es ist.Antworten:
C ++
Gesamtlänge: 9059, Gesamtfläche: 27469, Fehler: 13.
Hinweis: Die Punktzahl beinhaltet Fehlerstrafen.
Beispielausgabe:
Volle Ausgabe: http://pastebin.com/raw.php?i=spBUidBV
Lieben Sie nicht einfach Brute-Force-Lösungen? Dies ist ein bisschen mehr als ein einfacher Rückverfolgungsalgorithmus: Unser unermüdlicher Mitarbeiter bewegt sich auf der Karte und platziert nach Bedarf Zündschnüre und Feuerwerkskörper, während er alle möglichen Bewegungen zu jedem Zeitpunkt testet. Nun, fast - wir beschränken die Bewegungsmenge und geben nicht optimale Zustände frühzeitig auf, damit es nicht unerträglich lange dauert (und insbesondere damit es endet). Besondere Sorgfalt wird darauf verwendet, keine Zyklen oder unbeabsichtigten Aktionen zu erzeugen Wege gehen und nicht den gleichen Weg zurückgehen, den wir gekommen sind, so ist es garantiert, dass wir nicht zweimal denselben Staat besuchen. Trotzdem kann es eine Weile dauern, eine optimale Lösung zu finden. Daher geben wir die Optimierung einer Lösung auf, wenn sie zu lange dauert.
Dieser Algorithmus hat noch etwas Headroom. Zum einen lassen sich durch Erhöhen der
FRUSTRATION
Parameter bessere Lösungen finden . Es gibt keinen Geldautomaten der Konkurrenz, aber diese Nummern können erhöht werden, wenn und wann ...Kompilieren mit:
g++ fireworks.cpp -ofireworks -std=c++11 -pthread -O3
.Führen Sie mit:
./fireworks
.Liest die Eingabe von STDIN und schreibt die Ausgabe nach STDOUT (möglicherweise nicht in der richtigen Reihenfolge).
Python
Gesamtlänge: 17387, Gesamtfläche: 62285, Fehler: 44.
Beispielausgabe:
Volle Ausgabe: http://pastebin.com/raw.php?i=mgiqXCRK
Als Referenz ist hier ein viel einfacherer Ansatz. Es wird versucht, ein Feuerwerk an eine einzige Hauptsicherungsleitung anzuschließen, wodurch eine "Treppenform" entsteht. Wenn ein Feuerwerk nicht direkt mit der Hauptlinie verbunden werden kann (was passiert, wenn zwei oder mehr Feuerwerke gleichzeitig angezündet werden), wird die Hauptlinie nach einem Punkt zurückverfolgt, an dem es senkrecht nach unten oder rechts abzweigen kann (und wenn dies fehlschlägt) Es gibt keinen solchen Punkt.)
Es überrascht nicht , tut es schlimmer als der Brute-Force - Löser, aber nicht durch einen großen Spielraum. Ehrlich gesagt hatte ich erwartet, dass der Unterschied etwas größer sein würde.
Führen Sie mit:
python fireworks.py
.quelle