Polizei von Manhattan

8

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 1repräsentiert die folgende Karte:

Die Eingabe 3 1 2 4reprä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.

Beta-Zerfall
quelle
3
Wie weit kann ein Polizist sehen? Dh, wenn ich einen Polizisten an eine Kreuzung stelle, kann er dann die beiden Straßen entlang sehen?
Marinus
6
Was hindert mich daran, nur Cross Cops einzusetzen? Es scheint keine Rolle zu spielen, ob ein Polizist in unbewohnten Gebieten sucht oder denselben Bereich wie ein anderer Polizist scannt, solange dort ohnehin mindestens ein T- oder L-Polizist erforderlich wäre.
Ingo Bürk
Wenn Sie die Bedingung hinzufügen, dass sich die Sichtlinien nicht überlappen können und die Polizei nicht in unbewohnte Gebiete schauen kann, wäre dies etwas schwieriger. (hilft nicht der Plausibilität der Geschichte, aber ...)
Geobits
2
Ich stelle mir Chief Wiggum, Lou und Eddie vor.
Renae Lider
Offensichtlich werden die Leute übermäßig nervös, wenn sie zu viele Polizisten nebeneinander sehen.
Tally

Antworten:

7

CJam, 68 61 84 ... 59 49 48 79 Bytes

l~]__,+:+M@{:Ze<:X2/)_2*X-@+@@-\Z}*;[YY]/_,(\R*_,,:)W%{2\2*1a*+2+/_S*\,(@+\}/;+

Nimmt 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 2Paritä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 lautet2 * Number of blocks - Number of shared streets

Überprüfen wir für den 2 1Fall:

2 * 3 - 2 = 4

Richtig.

Lassen Sie uns nach dem 3 1 2 4Fall suchen :

2 * 10 - 10

Wieder korrigieren. Yipee, also ist der Code

l~]:L:+2*L:(:+L(+-[{_@e<}*]:+-

Versuchen wir dies nun an einigen weiteren Beispielen:

3 3

Ausgabe:

2 * 6 - 7 = 5

Aber warte, die eigentliche Antwort ist 6

Versuchen wir es mit einem anderen:

5 5

2 * 10 - 13 = 7 // Answer is 9 instead.

Siehst du das Muster?

Für jedes N NBlockpaar, bei dem N eine positive ganze Zahl größer als ist 2, benötige ich float((N+1)/2)-1neben der obigen Formel einen zusätzlichen Cop. Überprüfen wir es noch einmal:

5 5 3

2 * 13 - 18 = 8 // Answer is 11

Im obigen Beispiel haben wir 1 5 5Paar und 1 3 3Paar (aus den 5 3Blöcken)

Versuchen wir ein anderes Beispiel

5 5 4 4

2 * 18 - 27 = 9 // Answer is actually 14

Sie müssen denken, dass es nur gibt 5 5, 3 3und 3 3Paare (aus Blöcken 5 5, 5 4und 4 4verantw.), Also nur 4 zusätzliche Polizisten erforderlich, aber es gibt ein weiteres Paar.

Von den Blöcken 4 4haben wir nur verbraucht, 3 3damit wir 1 1frei haben. Dies bildet ein weiteres 3 3Blockpaar, das anhand des folgenden Bildes visualisiert werden kann:

Geben Sie hier die Bildbeschreibung ein

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.

l~]__                        "Read the input numbers, convert to array and make two copies";
     ,+                      "Get the number of columns and add that to the block array";
       :+                    "Sum the array elements to get number of blocks + columns";
         M@                  "Push empty array to stack and rotate input array to top";
{                         }* "Run this block for each pair in the block array";
 :Ze<:X                      "Store the later block size in Z, and minimum of two in X";
       @\-                   "Rotate swap and subtract shared sides from total sum";
          X)Y/(:T+           "Increment halve and decrement. Store in T and add to sum";
                  XTY*-      "Find unused blocks from this pair for perpendicular pairs";
                       @+    "Add unused blocks to the array M";
                         Z   "Push Z to stack to be used in next iteration";
           ;[YY]             "Pop the last pushed Z and push array [2 2] to stack";
                /,(+         "Check how many perpendicular pairs exist, add to total sum";

Beachten Sie, dass 2 * Number of blocks - Number of shared sidesauch geschrieben werden kann als Number of blocks + Number of columns - Number of shared sides between adjacant columns

Probieren Sie es hier online aus

Optimierer
quelle
1
Dies erzeugt die korrekte Ausgabe für alle Tests, die ich bisher versucht habe.
Beta Decay
Warum gibt Eingabe 2 2 2 die Lösung 5? Könnten Sie bitte erklären, wie eine Kombination mit 5 Sätzen möglich ist?
Renae Lider
Überprüfen Sie 4 4 4 4auch. Die Routine gibt 11, aber ich kann keine Möglichkeit sehen, es mit weniger als 12 zu tun.
COTO
Ich weiß, dass ich etwas spät dran bin, aber wie funktioniert das?
Beta Decay
Dies ergibt 18 für 2 2 1 1 2 2 1 2 2 1 1 2 2mein 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?
Nutki