pengantar
Sebagian besar dari Anda terbiasa dengan algoritma pengurutan gabungan untuk menyortir daftar angka. Sebagai bagian dari algoritma, seseorang menulis fungsi pembantu yang disebut merge
yang menggabungkan dua daftar yang diurutkan menjadi satu daftar yang diurutkan. Dalam pseudocode mirip-Python, fungsinya biasanya terlihat seperti ini:
function merge(A, B):
C = []
while A is not empty or B is not empty:
if A is empty:
C.append(B.pop())
else if B is empty or A[0] ≤ B[0]:
C.append(A.pop())
else:
C.append(B.pop())
return C
Idenya adalah untuk terus muncul elemen yang lebih kecil dari pertama A
dan B
sampai kedua daftar kosong, dan kumpulkan hasilnya C
. Jika A
dan B
keduanya diurutkan, maka begitu pula C
.
Sebaliknya, jika C
daftar diurutkan, dan kami membaginya menjadi dua urutan A
dan B
, kemudian A
dan B
juga diurutkan dan merge(A, B) == C
. Menariknya, ini tidak selalu berlaku jika C
tidak diurutkan, yang membawa kita ke tantangan ini.
Memasukkan
Input Anda adalah permutasi dari 2*n
bilangan bulat non-negatif pertama [0, 1, 2, ..., 2*n-1]
untuk beberapa n > 0
, diberikan sebagai daftar C
.
Keluaran
Output Anda akan menjadi nilai kebenaran jika ada dua daftar A
dan B
panjang n
sedemikian rupa C == merge(A, B)
, dan nilai palsu sebaliknya. Karena input tidak mengandung duplikat, Anda tidak perlu khawatir tentang bagaimana ikatan rusak dalam merge
fungsi.
Aturan dan Bonus
Anda dapat menulis fungsi atau program lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan.
Perhatikan bahwa Anda tidak diharuskan menghitung daftar A
dan B
dalam contoh "ya". Namun, jika Anda benar-benar menampilkan daftar, Anda menerima bonus -20% . Untuk mengklaim bonus ini, Anda harus menampilkan hanya satu pasang daftar, tidak semua kemungkinan. Untuk membuat bonus ini lebih mudah diklaim dalam bahasa yang diketik dengan sangat baik, diizinkan untuk mengeluarkan sepasang daftar kosong dalam contoh "tidak".
Brute forcing tidak dilarang, tetapi ada bonus -10% untuk menghitung semua dari empat kasus uji terakhir dalam total kurang dari 1 detik.
Uji Kasus
Hanya satu output yang mungkin diberikan dalam contoh "ya".
[1,0] -> False
[0,1] -> [0] [1]
[3,2,1,0] -> False
[0,3,2,1] -> False
[0,1,2,3] -> [0,1] [2,3]
[1,4,0,3,2,5] -> False
[4,2,0,5,1,3] -> [4,2,0] [5,1,3]
[3,4,1,2,5,0] -> [4,1,2] [3,5,0]
[6,2,9,3,0,7,5,1,8,4] -> False
[5,7,2,9,6,8,3,4,1,0] -> False
[5,6,0,7,8,1,3,9,2,4] -> [6,0,8,1,3] [5,7,9,2,4]
[5,3,7,0,2,9,1,6,4,8] -> [5,3,7,0,2] [9,1,6,4,8]
[0,6,4,8,7,5,2,3,9,1] -> [8,7,5,2,3] [0,6,4,9,1]
[9,6,10,15,12,13,1,3,8,19,0,16,5,7,17,2,4,11,18,14] -> False
[14,8,12,0,5,4,16,9,17,7,11,1,2,10,18,19,13,15,6,3] -> False
[4,11,5,6,9,14,17,1,3,15,10,12,7,8,0,18,19,2,13,16] -> [4,17,1,3,15,10,12,7,8,0] [11,5,6,9,14,18,19,2,13,16]
[9,4,2,14,7,13,1,16,12,11,3,8,6,15,17,19,0,10,18,5] -> [9,4,2,16,12,11,3,8,6,15] [14,7,13,1,17,19,0,10,18,5]
(K[0], Q-K[0])
Anda dapat mencetak(K[0], K[-1])
. Saya tidak tahu apakah itu akan menghemat.