Gambaran
Diberikan daftar kembang api a-z
dan waktu 3-78
, mengatur mereka dengan sekering untuk membuat semuanya menyala pada waktu yang tepat.
Baris input diberikan sebagai spasi dan huruf dan angka:
a 3 b 6 c 6 d 8 e 9 f 9
Contoh itu menunjukkan bahwa kembang api a
perlu menyala pada waktu 3
, b
dan c
keduanya di 6
, d
di 8
, dengan e
dan f
keduanya di 9
. Setiap baris berhubungan dengan satu peta.
Output adalah peta sekering / kembang api untuk setiap baris, menggunakan simbol |-
untuk menunjukkan sekering dan huruf untuk menunjukkan kembang api.
Sebuah -
menghubungkan sekering untuk sekering dan kembang api langsung kiri / kanan itu, sementara |
menghubungkan sekering dengan orang-orang / atas bawah. Sebagai contoh, sekering ||
yang tidak terhubung, dan -|
yang .
Misalnya, dua kemungkinan jawaban untuk yang di atas adalah:
---a ---------f
| ||| ||
|-c ||| de
--|--d a||
| b | |c
f e b
Semua peta sekering harus dimulai dengan satu -
di sudut kiri atas. Itu adalah titik di mana Anda menyalakan sekeringnya. Setiap karakter sekering membutuhkan satu detik untuk terbakar. Seperti yang Anda lihat, a
dicapai dalam tiga detik di kedua diagram, b
dalam enam, dll.
Sekarang, kedua peta yang diberikan di atas valid untuk input yang diberikan, tetapi yang satu jelas lebih efisien. Yang kiri hanya menggunakan 13 unit sekering, sedangkan yang kanan membutuhkan 20 unit.
Sekering tidak terbakar melalui kembang api! Jadi, untuk input a 3 b 5
, ini tidak valid:
---a--b
Tantangan
Tujuan Anda adalah untuk meminimalkan jumlah sekering yang digunakan pada semua kasus uji. Penilaian sangat sederhana, total unit sekering yang digunakan.
Jika Anda tidak dapat membuat peta untuk case uji, apakah itu case yang mustahil atau tidak, skor untuk case tersebut adalah jumlah sepanjang masa (41 untuk contoh di atas).
Dalam kasus seri, skor diubah sehingga peta yang paling kompak menang. Skor tiebreak adalah area kotak pembatas dari setiap peta. Artinya, panjang garis terpanjang dikalikan jumlah garis. Untuk peta "tidak mungkin", ini adalah kuadrat dari jumlah terbesar (81 untuk contoh di atas).
Dalam hal pengajuan mengikat kedua metode penilaian ini, pengikatan pergi ke entri / edit sebelumnya.
Program Anda harus deterministik, untuk keperluan verifikasi.
Uji Kasus
Ada 250 test case, berlokasi di sini . Masing-masing memiliki antara 4 dan 26 kembang api. Waktu sekering minimum untuk kembang api adalah 3. Kembang api dalam setiap kasus "diurutkan" berdasarkan waktu dan huruf, artinya b
tidak akan pernah menyala sebelumnya a
.
Saat memposting, harap sertakan program lengkap Anda, skor total Anda, dan peta yang dihasilkan untuk (setidaknya) kasus uji pertama yang diberikan dalam file:
a 6 b 8 c 11 d 11 e 11 f 11 g 12 h 15 i 18 j 18 k 21 l 23 m 26 n 28 o 28 p 30 q 32 r 33 s 33 t 34
sumber
rand.nextInt(5)%4
, jadi 40% kemungkinan0
, dan 20% untuk masing-masing1,2,3
.-+-
sebagai pengganti---
tidak akan secara otomatis menghubungkan kembang api di atas / bawah, masih harus ada di|
atas / di bawah untuk menghubungkannya ke kembang api.-+-
di tempat-|-
tidak apa-apa.Jawaban:
C ++
Total Panjang: 9059, Total Area: 27469, Kegagalan: 13.
Catatan: Skor termasuk penalti kegagalan.
Output sampel:
Output penuh: http://pastebin.com/raw.php?i=spBUidBV
Tidakkah Anda hanya menyukai solusi kekerasan? Ini sedikit lebih dari sekadar algoritma pelacakan mundur: pekerja kami yang tak kenal lelah bergerak di sekitar peta, menempatkan sekering dan kembang api seperlunya, sambil menguji semua gerakan yang mungkin dilakukan di titik mana pun. Yah, hampir --- kita memang membatasi serangkaian gerakan dan meninggalkan keadaan tidak optimal lebih awal sehingga tidak butuh waktu lama yang tak tertahankan (dan, khususnya, sehingga berakhir.) Perhatian khusus diambil untuk tidak membuat siklus atau tidak sengaja jalan dan tidak kembali dengan cara yang sama kami datang, jadi dijamin bahwa kami tidak mengunjungi negara yang sama dua kali. Meski begitu, menemukan solusi optimal dapat memakan waktu cukup lama, jadi kami akhirnya menyerah untuk mengoptimalkan solusi jika terlalu lama.
Algoritma ini masih memiliki beberapa ruang kepala. Untuk satu hal, solusi yang lebih baik dapat ditemukan dengan meningkatkan
FRUSTRATION
parameter. Tidak ada ATM kompetisi tetapi angka-angka ini dapat dihidupkan jika dan kapan ...Mengkompilasi dengan:
g++ fireworks.cpp -ofireworks -std=c++11 -pthread -O3
.Dijalankan dengan:
./fireworks
.Membaca input dari STDIN dan menulis output ke STDOUT (mungkin rusak).
Python
Total Panjang: 17387, Total Area: 62285, Kegagalan: 44.
Output sampel:
Output lengkap: http://pastebin.com/raw.php?i=mgiqXCRK
Untuk referensi, ini pendekatan yang lebih sederhana. Ia mencoba menghubungkan kembang api ke garis sekering utama tunggal, menciptakan bentuk "tangga". Jika kembang api tidak dapat terhubung ke jalur utama secara langsung (yang terjadi ketika dua atau lebih kembang api menyala pada saat yang sama) ia melacak garis utama mencari titik di mana ia dapat bercabang tegak lurus ke bawah atau ke kanan (dan gagal jika tidak ada titik seperti itu.)
Tidak mengherankan, ini memang lebih buruk dari pemecah brute-force, tetapi tidak dengan margin yang besar . Jujur, saya berharap perbedaannya menjadi agak lebih besar.
Dijalankan dengan:
python fireworks.py
.sumber