前書き
ほとんどの人は、数値のリストをソートするためのマージソートアルゴリズムに精通しています。アルゴリズムの一部として、merge
2つのソート済みリストを1つのソート済みリストに結合するというヘルパー関数を作成します。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
。
逆に、if C
がソートされたリストであり、それを任意の2つのサブシーケンスに分割した場合、A
およびB
、A
およびB
もソートされますおよびmerge(A, B) == C
。興味深いことに、C
ソートされていない場合、これは必ずしも当てはまらないため、この課題が発生します。
入力
あなたの入力はリストとして与えられたいくつかの最初の2*n
非負整数の順列です。[0, 1, 2, ..., 2*n-1]
n > 0
C
出力
あなたの出力は、2つのリストが存在する場合truthy値でなければならA
やB
長さのn
ようにC == merge(A, B)
そうでないと、falsy値。入力には重複が含まれていないため、merge
関数内でタイがどのように破損するかを心配する必要はありません。
ルールとボーナス
関数または完全なプログラムのいずれかを作成できます。最小のバイトカウントが優先され、標準の抜け穴は許可されません。
あなたがリストを計算するために必要とされていないことを注意A
し、B
「はい」の場合には。ただし、実際にリストを出力すると、-20%のボーナスを受け取ります。このボーナスを請求するには、すべての可能性ではなく、1組のリストのみを出力する必要があります。強く型付けされた言語でこのボーナスを請求しやすくするために、「no」インスタンスに空のリストのペアを出力できます。
総当たり攻撃は禁止されていませんが、合計1秒未満で最後の4つのテストケースすべてを計算すると、-10%のボーナスがあります。
テストケース
「yes」インスタンスで可能な出力は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])
。しかし、それが節約になるかどうかはわかりません。