introduction
La plupart d'entre vous connaissent l' algorithme de tri par fusion pour trier une liste de nombres. Dans le cadre de l'algorithme, on écrit une fonction d'aide appelée merge
qui combine deux listes triées en une seule liste triée. Dans un pseudocode de type Python, la fonction ressemble généralement à ceci:
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
L'idée est de continuer à faire apparaître le plus petit des premiers éléments de A
et B
jusqu'à ce que les deux listes soient vides, et de collecter les résultats dans C
. Si A
et B
sont tous deux triés, alors il en est de même C
.
Inversement, si C
est une liste triée, et nous la divisons en deux sous-séquences A
et B
, puis A
et B
sont également triées et merge(A, B) == C
. Fait intéressant, cela ne tient pas nécessairement si C
n'est pas trié, ce qui nous amène à ce défi.
Contribution
Votre entrée est une permutation des premiers 2*n
entiers non négatifs [0, 1, 2, ..., 2*n-1]
pour certains n > 0
, donnée sous forme de liste C
.
Production
Votre sortie doit être une valeur véridique s'il existe deux listes A
et B
de longueur n
telle que C == merge(A, B)
, et une valeur fausse sinon. Étant donné que l'entrée ne contient aucun doublon, vous n'avez pas à vous soucier de la façon dont les liens sont rompus dans la merge
fonction.
Règles et bonus
Vous pouvez écrire soit une fonction soit un programme complet. Le nombre d'octets le plus bas gagne et les failles standard sont interdites.
Notez que vous n'êtes pas obligé de calculer les listes A
et B
dans les instances "oui". Cependant, si vous affichez réellement les listes, vous recevez un bonus de -20% . Pour réclamer ce bonus, vous devez générer une seule paire de listes, pas toutes les possibilités. Pour rendre ce bonus plus facile à réclamer dans des langues fortement typées, il est permis de sortir une paire de listes vides dans les instances "non".
Le forçage brutal n'est pas interdit, mais il y a un bonus de -10% pour le calcul des quatre derniers cas de test en moins d'une seconde au total.
Cas de test
Une seule sortie possible est donnée dans les instances "oui".
[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])
vous pouvez imprimer(K[0], K[-1])
. Je ne sais pas si cela donnerait une économie, cependant.