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 1
mewakili peta berikut:
Input 3 1 2 4
mewakili 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.
Jawaban:
CJam,
68 61 84 ... 59 49 4879 byteMengambil 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 2
penjelasan 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 adalah
2 * Number of blocks - Number of shared streets
Mari kita periksa untuk
2 1
kasus:Benar.
Mari kita periksa
3 1 2 4
kasusnya:Perbaiki lagi. Yipee, begitu kodenya
Sekarang mari kita coba ini pada beberapa contoh lagi:
Keluaran:
Tapi tunggu, jawaban yang sebenarnya adalah 6
Mari kita coba yang lain:
Anda melihat polanya?
Untuk setiap
N N
pasangan blok, di mana N adalah bilangan bulat positif lebih besar dari2
, saya memerlukanfloat((N+1)/2)-1
cop tambahan selain rumus di atas. Mari kita verifikasi lagi:Dalam contoh di atas, kami memiliki 1
5 5
pasangan dan 13 3
pasangan (dari5 3
blok)Mari kita coba contoh lain
Anda harus berpikir bahwa hanya ada
5 5
,3 3
dan3 3
berpasangan (dari blok5 5
,5 4
dan4 4
resp.), Sehingga hanya 4 polisi tambahan yang diperlukan, tetapi ada satu pasangan lagi.Dari blok
4 4
, kami hanya menggunakan3 3
sehingga kami memiliki1 1
gratis, ini membuat3 3
pasangan blok lain yang dapat divisualisasikan menggunakan gambar di bawah ini: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.
Catatan yang
2 * Number of blocks - Number of shared sides
juga bisa ditulis sebagaiNumber of blocks + Number of columns - Number of shared sides between adjacant columns
Cobalah online di sini
sumber
4 4 4 4
juga. Rutinitas memberi11
, tetapi saya tidak bisa melihat cara melakukannya dengan kurang dari 12.2 2 1 1 2 2 1 2 2 1 1 2 2
contoh counter saya untuk solusi @FireFly. Namun saya tidak dapat melihat sesuatu yang lebih baik dari 19. Dapatkah Anda menunjukkan penempatan untuk test case ini?