Masalah
Bayangkan 7 ember berbaris berturut-turut. Setiap ember dapat memuat paling banyak 2 apel. Ada 13 apel berlabel 1 hingga 13. Mereka didistribusikan di antara 7 ember. Sebagai contoh,
{5,4}, {8,10}, {2,9}, {13,3}, {11,7}, {6,0}, {12,1}
Di mana 0 mewakili ruang kosong. Urutan di mana apel muncul dalam setiap ember tidak relevan (misalnya {5,4} setara dengan {4,5}).
Anda dapat memindahkan apel apa pun dari satu ember ke ember yang berdekatan, asalkan ada ruang di ember tujuan untuk apel lain. Setiap gerakan dijelaskan oleh jumlah apel yang ingin Anda pindahkan (yang tidak ambigu karena hanya ada satu ruang kosong). Misalnya, menerapkan langkah
7
dengan pengaturan di atas akan menghasilkan
{5,4}, {8,10}, {2,9}, {13,3}, {11,0}, {6,7}, {12,1}
Objektif
Tulis program yang membaca pengaturan dari STDIN dan mengurutkannya ke dalam pengaturan berikut
{1,2}, {3,4}, {5,6}, {7,8}, {9,10}, {11,12}, {13,0}
menggunakan gerakan sesedikit mungkin. Sekali lagi, urutan di mana apel muncul dalam setiap ember tidak relevan. Urutan ember tidak masalah. Seharusnya menampilkan gerakan yang digunakan untuk mengurutkan setiap pengaturan yang dipisahkan oleh koma. Sebagai contoh,
13, 7, 6, ...
Skor Anda sama dengan jumlah jumlah gerakan yang diperlukan untuk menyelesaikan pengaturan berikut:
{8, 2}, {11, 13}, {3, 12}, {6, 10}, {4, 0}, {1, 7}, {9, 5}
{3, 1}, {6, 9}, {7, 8}, {2, 11}, {10, 5}, {13, 4}, {12, 0}
{0, 2}, {4, 13}, {1, 10}, {11, 6}, {7, 12}, {8, 5}, {9, 3}
{6, 9}, {2, 10}, {7, 4}, {1, 8}, {12, 0}, {5, 11}, {3, 13}
{4, 5}, {10, 3}, {6, 9}, {8, 13}, {0, 2}, {1, 7}, {12, 11}
{4, 2}, {10, 5}, {0, 7}, {9, 8}, {3, 13}, {1, 11}, {6, 12}
{9, 3}, {5, 4}, {0, 6}, {1, 7}, {12, 11}, {10, 2}, {8, 13}
{3, 4}, {10, 9}, {8, 12}, {2, 6}, {5, 1}, {11, 13}, {7, 0}
{10, 0}, {12, 2}, {3, 5}, {9, 11}, {1, 13}, {4, 8}, {7, 6}
{6, 1}, {3, 5}, {11, 12}, {2, 10}, {7, 4}, {13, 8}, {0, 9}
Ya, masing-masing pengaturan ini memiliki solusi.
Aturan
- Solusi Anda harus dijalankan dalam waktu polinomial dalam jumlah ember per gerakan. Intinya adalah menggunakan heuristik pintar.
- Semua algoritma harus deterministik.
- Jika terjadi seri, hitungan byte terpendek akan menang.
sumber
Jawaban:
Nilai: 448
Ide saya adalah untuk mengurutkannya secara berurutan, dimulai dengan 1. Ini memberi kita properti bagus bahwa ketika kita ingin memindahkan ruang ke keranjang sebelumnya / berikutnya, kita tahu persis mana dari dua apel yang harus kita pindahkan - maks / min satu, masing-masing. Berikut ini adalah rincian tesnya:
Kode ini dapat lebih banyak bermain golf, tetapi kualitas kode yang lebih baik akan memotivasi jawaban tambahan.
C ++ (501 bytes)
Perbaikan lebih lanjut mungkin beralih ke C dan mencoba untuk menurunkan skor dengan mulai dari nilai-nilai besar ke bawah (dan mereka akhirnya menggabungkan kedua solusi).
sumber
C,
426448Jenis apel ini satu per satu dari 1 hingga 13 mirip dengan metode yasen , kecuali setiap kali ia memiliki peluang untuk memindahkan jumlah yang lebih besar ke atas atau jumlah yang lebih kecil ke bawah, ia akan menerimanya.
Sayangnya, ini hanya meningkatkan kinerja pada masalah tes pertama, tetapi peningkatan kecil.Saya membuat kesalahan saat menjalankan masalah tes. Sepertinya saya sudah cukup menerapkan metode yasen.Dibutuhkan input tanpa kawat gigi atau koma, mis
Berikut adalah kode golf yang datang dengan kecepatan 423 byte yang menghitung beberapa baris baru yang tidak perlu (mungkin bisa lebih banyak golf, tetapi saya berharap skor ini dapat dikalahkan):
Dan kode ungolfed, yang juga mencetak skor:
sumber
Python 3 - 121
Ini mengimplementasikan pencarian kedalaman-pertama dengan meningkatkan kedalaman hingga menemukan solusi. Ini menggunakan kamus untuk menyimpan status yang dikunjungi sehingga tidak mengunjunginya lagi kecuali dengan jendela kedalaman yang lebih tinggi. Saat memutuskan negara mana yang akan diperiksa, ia menggunakan jumlah elemen yang salah tempat sebagai heuristik, dan hanya mengunjungi negara terbaik. Perhatikan bahwa karena urutan elemen dalam ember mereka tidak masalah, ia selalu mempertahankan pemesanan dalam ember. Ini membuatnya lebih mudah untuk memeriksa apakah suatu elemen salah tempat.
Input adalah array int, dengan int pertama adalah jumlah ember.
Jadi misalnya, untuk # 8 (yang ini membutuhkan waktu sangat lama untuk berjalan di komputer saya, yang lain selesai dalam hitungan detik):
Berikut adalah hasil pada set tes: # 1: 12, # 2: 12, # 3: 12, # 4: 12, # 5: 11, # 6: 11, # 7: 10, # 8: 14, # 9: 13, # 10: 14
Ini kodenya:
sumber