Saat menumpuk buku, Anda biasanya ingin meletakkan yang terbesar di bagian bawah dan yang terkecil di bagian atas. Namun, OCD laten saya membuat saya merasa sangat tidak nyaman jika saya punya dua buku di mana satu lebih pendek (tingginya) tetapi lebih lebar dari yang lain. Tidak peduli urutan mana saya menempatkan mereka, buku teratas akan melampaui buku bawah di satu sisi.
Sebagai contoh, katakanlah satu buku memiliki dimensi (10,15)
dan yang lain memiliki dimensi (11,14)
. Tidak peduli ke arah mana saya menempatkan mereka, saya mendapatkan overhang. Tetapi jika saya memiliki buku dengan dimensi (4,3)
dan (5,6)
, saya bisa menghindari menggantung dengan menempatkan yang terakhir di bawah yang pertama.
Untuk keperluan tantangan ini, kami hanya akan mempertimbangkan perubahan terkait dengan buku di bawah ini . Misalnya jika saya memiliki setumpuk (5,5)
, (3,3)
, (4,4)
(bukan bahwa setiap waras orang akan melakukan itu), penghitungan buku atas sebagai overhang, meskipun tidak melampaui buku bawah. Demikian pula, tumpukan (3,3)
, (3,3)
, (4,4)
juga hanya memiliki satu overhang, meskipun buku atas memperluas luar satu bawah.
Tantangan
Diberi daftar pasangan integer untuk dimensi buku, urutkan pasangan / buku sedemikian sehingga jumlah overhang minimal. Anda tidak boleh memutar buku - saya ingin semua duri menghadap ke arah yang sama. Jika ada beberapa solusi dengan jumlah overhang yang sama, Anda dapat memilih urutan tersebut. Algoritma pengurutan Anda tidak harus stabil. Implementasi Anda dapat mengasumsikan bahwa dimensi buku masing-masing kurang dari 16 .
Kompleksitas waktu: Untuk membuat ini sedikit lebih menarik, kompleksitas kasus terburuk asimtotik algoritma Anda harus polinomial dalam ukuran tumpukan. Jadi Anda tidak bisa hanya menguji setiap permutasi yang mungkin. Harap sertakan bukti singkat tentang optimalitas dan kompleksitas algoritma Anda dan secara opsional plot yang menunjukkan penskalaan untuk input acak besar. Tentu saja, Anda tidak dapat menggunakan ukuran maksimum input sebagai argumen bahwa kode Anda berjalan di O (1).
Anda dapat menulis sebuah program atau fungsi, mengambil input melalui STDIN, ARGV atau argumen fungsi dalam format daftar yang mudah (tidak diproses) dan mencetak atau mengembalikan hasilnya.
Ini adalah kode golf, jadi jawaban tersingkat (dalam byte) menang.
Saya yakin bahwa ada solusi polinomial, tetapi jika Anda dapat membuktikan bahwa saya salah, Anda dapat mengirimkan bukti seperti itu alih-alih pengiriman golf. Dalam hal ini, Anda dapat mengasumsikan P ≠ NP . Saya akan menerima bukti yang benar pertama dan memberikan hadiah untuk itu.
Contohnya
In: [[1, 1], [10, 10], [4, 5], [7, 5], [7, 7], [10, 10], [9, 8], [7, 5], [7, 5], [3, 1]]
Out: [[10, 10], [10, 10], [9, 8], [7, 7], [7, 5], [7, 5], [7, 5], [4, 5], [3, 1], [1, 1]]
In: [[4, 5], [5, 4], [5, 4], [5, 4], [5, 4], [4, 5], [4, 5], [4, 5], [5, 4], [4, 5]]
Out: [[4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [5, 4], [5, 4], [5, 4], [5, 4], [5, 4]]
or [[5, 4], [5, 4], [5, 4], [5, 4], [5, 4], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5]]
In: [[2, 3], [1, 1], [5, 5], [7, 1]]
Out: [[5, 5], [2, 3], [7, 1], [1, 1]]
or [[5, 5], [2, 3], [1, 1], [7, 1]]
or [[7, 1], [5, 5], [2, 3], [1, 1]]
or [[7, 1], [1, 1], [5, 5], [2, 3]]
Saya membuat ini dengan tangan, jadi beri tahu saya jika Anda menemukan kesalahan.