Polisi Manhattan

8

pengantar

Anda adalah kepala polisi NYPD dan Anda telah ditugaskan untuk menempatkan petugas polisi sehingga semua jalan dipatroli. Namun, pasukan Anda kekurangan staf, artinya Anda perlu memposisikan petugas seminimal mungkin.

Tantangan

Diberi peta blok, Anda harus mengembalikan jumlah petugas terkecil yang diperlukan untuk mengamankan jalan-jalan.

Aturan

Ada tiga jenis petugas polisi: seorang polisi L, seorang polisi T dan seorang polisi lintas. Polisi T hanya dapat melihat dalam tiga arah. Polisi L dapat melihat dua jalan yang tegak lurus. Polisi lintas dapat melihat keempat jalan.

Peta akan diberikan melalui argv atau STDIN sebagai angka yang dipisahkan oleh ruang. Angka-angka mewakili jumlah blok di setiap kolom. Sebagai contoh:

Input 2 1mewakili peta berikut:

Input 3 1 2 4mewakili peta berikut:

Seorang petugas polisi hanya dapat ditempatkan di persimpangan dan pandangannya mungkin hanya di sepanjang sisi blok (polisi mungkin tidak melihat ke daerah yang tidak berpenghuni).

Seorang polisi hanya dapat melihat satu blok dan tidak dapat melihat di sepanjang jalan di mana petugas polisi lainnya mencari makna bahwa garis pandang tidak boleh tumpang tindih.

Contohnya

Memasukkan: 2 1

Keluaran: 4


Memasukkan: 2 2

Keluaran: 4


Memasukkan: 3 1 4 1 5 9

Keluaran: 22

Kemenangan

Kode terpendek menang.

Peluruhan Beta
sumber
3
Seberapa jauh seorang polisi bisa melihat? Yaitu, jika saya menempatkan polisi di persimpangan, dapatkah dia melihat semua jalan di kedua jalan?
marinus
6
Apa yang menghentikan saya dari hanya menggunakan lintas polisi? Tampaknya tidak masalah apakah seorang polisi terlihat di daerah yang tidak berpenghuni atau memindai daerah yang sama dengan polisi lain selama setidaknya polisi T atau L akan diperlukan di sana.
Ingo Bürk
Jika Anda menambahkan kondisi bahwa garis pandang tidak bisa tumpang tindih dan polisi tidak bisa melihat di daerah yang tidak berpenghuni, ini akan sedikit lebih menantang. (tidak membantu masuk akal cerita itu, tapi ...)
Geobits
2
Saya membayangkan Kepala Wiggum, Lou dan Eddie.
Renae Lider
Jelas orang menjadi sangat gugup jika mereka melihat terlalu banyak polisi di sebelah satu sama lain.
Tally

Jawaban:

7

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

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

Mengambil input dalam format yang sama seperti pada pertanyaan.

PEMBARUAN : Memperbaiki algoritme untuk kasus uji yang serupa dengan yang ditunjukkan oleh @nutki. Meskipun itu membuat kode hampir dua kali lipat, akan mencoba untuk golf sekarang setelah diperbaiki.

Cara kerjanya (Agak tidak lengkap, akan menambahkan 2 1 2penjelasan paritas nanti)

Segera setelah saya melihat pertanyaan ini, saya tahu bahwa akan ada rumus matematika untuk mendapatkan jawabannya. Setelah mencoba beberapa kombinasi, saya pikir rumusnya adalah2 * Number of blocks - Number of shared streets

Mari kita periksa untuk 2 1kasus:

2 * 3 - 2 = 4

Benar.

Mari kita periksa 3 1 2 4kasusnya:

2 * 10 - 10

Perbaiki lagi. Yipee, begitu kodenya

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

Sekarang mari kita coba ini pada beberapa contoh lagi:

3 3

Keluaran:

2 * 6 - 7 = 5

Tapi tunggu, jawaban yang sebenarnya adalah 6

Mari kita coba yang lain:

5 5

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

Anda melihat polanya?

Untuk setiap N Npasangan blok, di mana N adalah bilangan bulat positif lebih besar dari 2, saya memerlukan float((N+1)/2)-1cop tambahan selain rumus di atas. Mari kita verifikasi lagi:

5 5 3

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

Dalam contoh di atas, kami memiliki 1 5 5pasangan dan 1 3 3pasangan (dari 5 3blok)

Mari kita coba contoh lain

5 5 4 4

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

Anda harus berpikir bahwa hanya ada 5 5, 3 3dan 3 3berpasangan (dari blok 5 5, 5 4dan 4 4resp.), Sehingga hanya 4 polisi tambahan yang diperlukan, tetapi ada satu pasangan lagi.

Dari blok 4 4, kami hanya menggunakan 3 3sehingga kami memiliki 1 1gratis, ini membuat 3 3pasangan blok lain yang dapat divisualisasikan menggunakan gambar di bawah ini:

masukkan deskripsi gambar di sini

Garis merah adalah pasangan yang biasa, garis biru adalah pasangan tegak lurus yang saya bicarakan di atas.

Agak sulit dijelaskan karena sementara garis merah hanya berbagi 1 sisi pasangan, sisi biru juga berbagi 1 sisi + 1 blok. Tetapi logika ini berfungsi untuk semua kombinasi blok.

Kode sekarang hanya menghitung itu.

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

Catatan yang 2 * Number of blocks - Number of shared sidesjuga bisa ditulis sebagai Number of blocks + Number of columns - Number of shared sides between adjacant columns

Cobalah online di sini

Pengoptimal
sumber
1
Ini menghasilkan output yang benar untuk semua tes yang saya coba sejauh ini.
Beta Decay
Mengapa input 2 2 2 memberikan solusi 5? Bisakah Anda jelaskan bagaimana kombinasi 5 set dimungkinkan?
Renae Lider
Periksa 4 4 4 4juga. Rutinitas memberi 11, tetapi saya tidak bisa melihat cara melakukannya dengan kurang dari 12.
COTO
Saya tahu saya agak terlambat, tetapi bagaimana cara kerjanya?
Beta Decay
Ini memberi 18 2 2 1 1 2 2 1 2 2 1 1 2 2contoh counter saya untuk solusi @FireFly. Namun saya tidak dapat melihat sesuatu yang lebih baik dari 19. Dapatkah Anda menunjukkan penempatan untuk test case ini?
nutki