Introducción
La mayoría de ustedes está familiarizado con el algoritmo de clasificación de fusión para ordenar una lista de números. Como parte del algoritmo, se escribe una función auxiliar llamada merge
que combina dos listas ordenadas en una lista ordenada. En el pseudocódigo similar a Python, la función generalmente se ve así:
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
La idea es seguir haciendo aparecer el primer elemento más pequeño de A
y B
hasta que ambas listas estén vacías, y recopilar los resultados C
. Si A
y B
están ambos ordenados, entonces también lo está C
.
Por el contrario, si C
es una lista ordenada, y dividirlo en dos subsecuencias A
y B
, a continuación, A
y B
también se ordenan y merge(A, B) == C
. Curiosamente, esto no se cumple necesariamente si C
no se clasifica, lo que nos lleva a este desafío.
Entrada
Su entrada es una permutación de los primeros 2*n
enteros no negativos [0, 1, 2, ..., 2*n-1]
para algunos n > 0
, dada como una lista C
.
Salida
Su salida será un valor verdadero si existen dos listas A
y B
de longitud n
tal que C == merge(A, B)
, y un valor falso de lo contrario. Como la entrada no contiene duplicados, no tiene que preocuparse por cómo se rompen los lazos en la merge
función.
Reglas y bonos
Puede escribir una función o un programa completo. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.
Tenga en cuenta que no es necesario que calcule las listas A
y B
en las instancias de "sí". Sin embargo, si realmente genera las listas, recibirá una bonificación de -20% . Para reclamar este bono, debe generar solo un par de listas, no todas las posibilidades. Para hacer que este bono sea más fácil de reclamar en idiomas fuertemente tipados, está permitido generar un par de listas vacías en las instancias "no".
El forzamiento bruto no está prohibido, pero hay una bonificación de -10% para calcular los últimos cuatro casos de prueba en menos de 1 segundo en total.
Casos de prueba
Solo se da una salida posible en las instancias "yes".
[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])
, puede imprimir(K[0], K[-1])
. Sin embargo, no sé si eso daría un ahorro.K[::len(K)-1]
.GolfScript (35 * 0.9 = 31.5)
La demostración en línea es bastante lenta: en mi computadora, ejecuta todas las pruebas en menos de 0.04 segundos, por lo que reclamo la reducción del 10%.
Explicación
fuente
APL,
625044 * 90% = 39,6Pruébalo aquí.
fuente