소개
대부분의 사용자는 숫자 목록을 정렬 하기위한 병합 정렬 알고리즘에 익숙 합니다. 알고리즘의 일부로 merge
두 개의 정렬 된 목록을 하나의 정렬 된 목록으로 결합 하는 헬퍼 함수를 작성 합니다. 파이썬과 유사한 의사 코드에서 함수는 일반적으로 다음과 같습니다.
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
and B
가 모두 정렬 된 경우 입니다 C
.
반대로, 경우는 C
정렬 된 목록입니다, 우리는 두 개의 서브 시퀀스로 분할 A
하고 B
, 다음 A
과 B
같은 분류하고merge(A, B) == C
. 흥미롭게도, C
정렬 되지 않은 경우 반드시 보유하지 않아도되므로이 문제가 발생합니다.
입력
입력은 목록으로 주어진 일부 에 대한 첫 번째 2*n
음이 아닌 정수 의 순열입니다.[0, 1, 2, ..., 2*n-1]
n > 0
C
.
산출
다음 A
과 같은 두 개의 목록 과 B
길이의 목록이 있으면 출력값이 진실한 값이되고 그렇지 않으면 거짓 값이됩니다. 입력에 중복 항목이 없으므로 관계가 어떻게 끊어 질지 걱정할 필요가 없습니다.n
C == merge(A, B)
merge
함수 .
규칙 및 보너스
함수 또는 전체 프로그램을 작성할 수 있습니다. 가장 낮은 바이트 수가 이기고 표준 허점은 허용되지 않습니다.
"yes"인스턴스 A
와 목록을 계산할 필요는 없습니다 B
. 그러나 실제로 목록을 출력하면 -20 % 의 보너스 를받습니다 . 이 보너스를 청구하려면 모든 가능성이 아니라 한 쌍의 목록 만 출력해야합니다. 이 보너스를 강력한 유형의 언어로 쉽게 청구 할 수 있도록 "no"인스턴스에서 빈 목록 쌍을 출력 할 수 있습니다.
무차별 강제 실행은 금지되지 않지만, 총 4 초 동안 마지막 4 개의 테스트 사례를 모두 계산할 때 -10 % 의 보너스가 있습니다.
테스트 사례
"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])
할 수 있습니다.(K[0], K[-1])
. 그래도 저축이 가능한지 모르겠습니다.