Einführung
Sie sind der Polizeichef der NYPD und wurden beauftragt, Polizisten so zu positionieren, dass alle Straßen überwacht werden. Ihr Trupp ist jedoch unterbesetzt, was bedeutet, dass Sie so wenig Offiziere wie möglich positionieren müssen.
Herausforderung
Bei einer Karte mit Blöcken müssen Sie die geringste Anzahl von Beamten zurückgeben, die zur Sicherung der Straßen erforderlich sind.
Regeln
Es gibt drei Arten von Polizisten: einen L-Cop, einen T-Cop und einen Cross-Cop. Der T-Cop kann nur in drei Richtungen sehen. Der L-Cop kann zwei senkrecht verlaufende Straßen sehen. Der Cross Cop kann alle vier Straßen sehen.
Die Karte wird über argv oder STDIN als durch Leerzeichen getrennte Zahlen geliefert. Die Zahlen geben die Anzahl der Blöcke in jeder Spalte an. Zum Beispiel:
Die Eingabe 2 1
repräsentiert die folgende Karte:
Die Eingabe 3 1 2 4
repräsentiert die folgende Karte:
Ein Polizist darf nur an einer Kreuzung platziert werden und sein Blick darf nur entlang eines Blocks gerichtet sein (Polizisten dürfen nicht in unbewohnte Gebiete schauen).
Ein Polizist kann nur einen Block sehen und nicht entlang einer Straße schauen, in die ein anderer Polizist schaut, was bedeutet, dass sich die Sichtlinien nicht überlappen dürfen.
Beispiele
Eingang: 2 1
Ausgabe: 4
Eingang: 2 2
Ausgabe: 4
Eingang: 3 1 4 1 5 9
Ausgabe: 22
Gewinnen
Der kürzeste Code gewinnt.
Antworten:
CJam,
68 61 84 ... 59 49 4879 BytesNimmt Eingaben im gleichen Format wie in Frage.
UPDATE : Der Algorithmus für Testfälle wurde korrigiert, ähnlich wie bei @nutki. Obwohl der Code fast doppelt so groß war, werde ich versuchen, ihn jetzt zu spielen, da er behoben ist.
Wie es funktioniert (Etwas unvollständig, wird die
2 1 2
Paritätserklärung später hinzufügen )Sobald ich diese Frage sah, wusste ich, dass es eine mathematische Formel geben würde, um die Antwort zu erhalten. Nachdem ich einige Kombinationen ausprobiert hatte, stellte ich fest, dass die Formel lautet
2 * Number of blocks - Number of shared streets
Überprüfen wir für den
2 1
Fall:Richtig.
Lassen Sie uns nach dem
3 1 2 4
Fall suchen :Wieder korrigieren. Yipee, also ist der Code
Versuchen wir dies nun an einigen weiteren Beispielen:
Ausgabe:
Aber warte, die eigentliche Antwort ist 6
Versuchen wir es mit einem anderen:
Siehst du das Muster?
Für jedes
N N
Blockpaar, bei dem N eine positive ganze Zahl größer als ist2
, benötige ichfloat((N+1)/2)-1
neben der obigen Formel einen zusätzlichen Cop. Überprüfen wir es noch einmal:Im obigen Beispiel haben wir 1
5 5
Paar und 13 3
Paar (aus den5 3
Blöcken)Versuchen wir ein anderes Beispiel
Sie müssen denken, dass es nur gibt
5 5
,3 3
und3 3
Paare (aus Blöcken5 5
,5 4
und4 4
verantw.), Also nur 4 zusätzliche Polizisten erforderlich, aber es gibt ein weiteres Paar.Von den Blöcken
4 4
haben wir nur verbraucht,3 3
damit wir1 1
frei haben. Dies bildet ein weiteres3 3
Blockpaar, das anhand des folgenden Bildes visualisiert werden kann:Die roten Umrisse sind die üblichen Paare, die blauen Umrisse sind die senkrechten Paare, über die ich oben spreche.
Es ist schwer zu erklären, da die roten Umrisse nur 1 Seite des Paares teilen, während die blauen auch 1 Seite + 1 Block teilen. Diese Logik funktioniert jedoch für alle Blockkombinationen.
Der Code berechnet das jetzt einfach.
Beachten Sie, dass
2 * Number of blocks - Number of shared sides
auch geschrieben werden kann alsNumber of blocks + Number of columns - Number of shared sides between adjacant columns
Probieren Sie es hier online aus
quelle
4 4 4 4
auch. Die Routine gibt11
, aber ich kann keine Möglichkeit sehen, es mit weniger als 12 zu tun.2 2 1 1 2 2 1 2 2 1 1 2 2
mein Gegenbeispiel für die @ FireFly-Lösung. Ich kann jedoch nichts besseres als 19 sehen. Können Sie die Platzierung für diesen Testfall zeigen?