マンハッタン警察


8

前書き

あなたはニューヨーク市警の警察署長であり、すべての道路がパトロールされるように警察官を配置するように命じられています。ただし、部隊のスタッフは不足しています。つまり、できるだけ少ない将校を配置する必要があります。

チャレンジ

ブロックのマップが与えられたら、道路を確保するために必要な最少数の将校を返さなければなりません。

ルール

警察官には、L警官、T警官、クロス警官の3種類があります。T警官は3方向のみを見ることができます。L警官は、垂直な2つの通りを見下ろすことができます。クロス警官は、4つの通りすべてを見下ろすことができます。

マップは、スペースで区切られた数値としてargvまたはSTDINを介して提供されます。数値は、各列のブロック数を表します。例えば:

入力2 1は次のマップを表します。

入力3 1 2 4は次のマップを表します。

警察官は交差点にのみ配置することができ、その視界はブロックの側面にのみ沿うことができます(警官は人が住んでいないエリアを覗くことはできません)。

警官は1ブロックしか見ることができず、別の警察官が見ている通りに沿って見ることはできません。つまり、視線が重なってはいけません。

例

入力: 2 1

出力: 4


入力: 2 2

出力: 4


入力: 3 1 4 1 5 9

出力: 22

勝利

最短のコードが優先されます。


3
警官はどこまで見ることができますか?つまり、交差点に警官を置いた場合、彼は両方の通りをずっと見下ろすことができますか?
— マリナス2014年

6
何が私をクロスコップだけを使うのをやめさせるのですか?少なくともTまたはLの警官がそこにとにかく必要である限り、警官が無人エリアを探すか、別の警官と同じエリアをスキャンするかは問題ではないようです。
— IngoBürk、2014年

視線が重ならず、警官が無人エリアを見ることができないという条件を追加すると、これは少し難しいでしょう。(ストーリーの妥当性には役立ちませんが...)
— Geobits '10 / 10/6

2
ウィグム首長、ルー、エディを描いています。
— Renae Lider 2014年

警官が隣り合って警官が多すぎると、明らかに緊張しすぎます。
— タリー

回答:


7

CJam、68 61 84 ... 59 49 48 79バイト

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

問題と同じ形式で入力を受け取ります。

更新:@nutkiによって指摘されたものと同様のテストケースのアルゴリズムを修正しました。コードのサイズがほぼ2倍になりましたが、修正されたので、今からゴルフを試してみましょう。

それがどのように機能するか (少し不完全です、2 1 2後でパリティの説明を追加します)

この質問を見るとすぐに、答えを得るための数式があることがわかりました。いくつかの組み合わせを試した後、私は式が2 * Number of blocks - Number of shared streets

2 1ケースをチェックしましょう:

2 * 3 - 2 = 4

正しい。

3 1 2 4ケースを確認しましょう:

2 * 10 - 10

もう一度訂正してください。イピー、コードは

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

これをいくつかの例で試してみましょう:

3 3

出力:

2 * 6 - 7 = 5

しかし、待ってください、実際の答えは6です。

別のものを試してみましょう:

5 5

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

パターンが見えますか?

N NNがより大きい正の整数であるすべてのブロックペアについて、上記の式とは別に追加のcopが2必要ですfloat((N+1)/2)-1。もう一度確認してみましょう:

5 5 3

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

上記の例では、1 5 5つのペアと1 3 3つのペア(5 3ブロックから)があります。

別の例を試してみましょう

5 5 4 4

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

あなただけがあることを考えなければなりません5 5、3 3と3 3のペア(ブロックから5 5、5 4および4 4RESP。)、これのみ4余分な警官が必要ですが、もう一つのペアがあります。

ブロックからは4 4、使い切っただけな3 3ので1 1空きがあります。これは3 3、下の画像を使用して視覚化できる別のブロックペアを構成します。

ここに画像の説明を入力してください

輪郭を描かれた赤は通常のペアであり、輪郭を描かれた青は垂直方向のペアです。

概説されている赤はペアの片側だけを共有しているのに対し、青いものは片側+ 1ブロックを共有しているため、説明するのは難しいです。しかし、このロジックはすべてのブロックの組み合わせで機能します。

コードは今それを単に計算しています。

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";

次の2 * Number of blocks - Number of shared sidesように書くこともできます Number of blocks + Number of columns - Number of shared sides between adjacant columns

ここでオンラインでお試しください


1
これにより、これまでに試したすべてのテストに対して正しい出力が生成されます。
— Beta Decay 2014年

input 2 2 2がソリューション5を与えるのはなぜですか?5セットの組み合わせがどのように可能であるか説明していただけませんか?
— Renaeリデル

4 4 4 4同様に確認してください。ルーチンは与え11たが、私は12よりも少ないと、それを行うための任意の方法を見ることができない
— COTO

私は少し遅れていることを知っていますが、これはどのように機能しますか?
— Beta Decay 2014年

これにより2 2 1 1 2 2 1 2 2 1 1 2 2、@ FireFlyソリューションの私の反例として18が与えられます。ただし、19以上のものはありません。このテストケースの配置を示していただけますか?
— nutki 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.