Вступ
Більшість із вас знайомі з алгоритмом сортування злиття для сортування списку чисел. Як частина алгоритму, людина пише функцію помічника, merge
яка поєднує два відсортовані списки в один відсортований список. У псевдокоді, подібному Python, функція зазвичай виглядає приблизно так:
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
Ідея полягає у тому, щоб постійно з'являти менший з перших елементів A
та B
до тих пір, поки обидва списки не будуть порожніми, і збирати результати C
. Якщо A
і B
обидва сортуються, то так і є C
.
І навпаки, якщо C
це відсортований список, і ми розділимо його на будь-які дві піддачі A
і B
, тоді A
і будемо B
також відсортовані і merge(A, B) == C
. Цікаво, що це не обов'язково має місце, якщо C
його не сортувати, що приводить нас до цього виклику.
Вхідні дані
Ваш вхід - це перестановка перших 2*n
неотримані цілих чисел [0, 1, 2, ..., 2*n-1]
для деяких n > 0
, поданих у вигляді списку C
.
Вихідні дані
Ваш висновок повинен бути значенням truthy , якщо існують два списки A
і B
довжини n
таких , що C == merge(A, B)
і falsy значення в іншому випадку. Оскільки вхід не містить дублікатів, вам не доведеться турбуватися про те, як розриваються зв'язки у merge
функції.
Правила та бонуси
Ви можете написати або функцію, або повну програму. Виграє найменший байт, а стандартні лазівки заборонені.
Зауважте, що вам не потрібно обчислювати списки A
та B
в екземплярах "так". Однак якщо ви фактично виведете списки, ви отримуєте бонус -20% . Щоб претендувати на цей бонус, потрібно вивести лише одну пару списків, не всі можливості. Щоб полегшити заявку на цей бонус у сильно набраних мовах, дозволено виводити пару порожніх списків в екземплярах "ні".
Брутне форсування не заборонено, але існує бонус у розмірі -10% за обчислення всіх останніх чотирьох тестових випадків загалом менше 1 секунди.
Випробування
В екземплярах "так" подається лише один можливий вихід.
[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])
ви можете друкувати(K[0], K[-1])
. Я не знаю, чи це дозволило б заощадити.