Giới thiệu
Hầu hết các bạn đều quen thuộc với thuật toán sắp xếp hợp nhất để sắp xếp danh sách các số. Là một phần của thuật toán, người ta viết một hàm trợ giúp được gọi là merge
kết hợp hai danh sách được sắp xếp thành một danh sách được sắp xếp. Trong mã giả giống như Python, hàm thường trông giống như thế này:
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
Ý tưởng là tiếp tục xuất hiện các phần tử đầu tiên nhỏ hơn A
và B
cho đến khi cả hai danh sách đều trống và thu thập kết quả vào C
. Nếu A
và B
được cả hai sắp xếp, thì cũng vậy C
.
Ngược lại, nếu C
là một danh sách được sắp xếp, và chúng tôi chia nó thành bất kỳ hai subsequences A
và B
, sau đó A
và B
cũng đều được sắp xếp và merge(A, B) == C
. Thật thú vị, điều này không nhất thiết phải giữ nếu C
không được sắp xếp, điều này đưa chúng ta đến thử thách này.
Đầu vào
Đầu vào của bạn là một hoán vị của các 2*n
số nguyên không âm đầu tiên [0, 1, 2, ..., 2*n-1]
cho một số n > 0
, được đưa ra dưới dạng danh sách C
.
Đầu ra
Đầu ra của bạn sẽ là một giá trị trung thực nếu tồn tại hai danh sách A
và B
độ dài n
sao cho C == merge(A, B)
giá trị giả mạo khác. Vì đầu vào không chứa các bản sao, bạn không phải lo lắng về việc các mối quan hệ bị phá vỡ trong merge
chức năng.
Quy tắc và tiền thưởng
Bạn có thể viết một hàm hoặc một chương trình đầy đủ. Số byte thấp nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép.
Lưu ý rằng bạn không bắt buộc phải tính toán các danh sách A
và B
trong trường hợp "có". Tuy nhiên, nếu bạn thực sự xuất danh sách, bạn sẽ nhận được tiền thưởng -20% . Để nhận phần thưởng này, bạn phải xuất ra chỉ một cặp danh sách, không phải tất cả các khả năng. Để làm cho phần thưởng này dễ dàng hơn để yêu cầu bằng các ngôn ngữ được gõ mạnh, nó được phép xuất ra một cặp danh sách trống trong các trường hợp "không".
Buộc cưỡng bức không bị cấm, nhưng có phần thưởng -10% cho việc tính toán tất cả bốn trường hợp thử nghiệm gần đây trong tổng số dưới 1 giây.
Các trường hợp thử nghiệm
Chỉ có một đầu ra có thể được đưa ra trong các trường hợp "có".
[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])
bạn có thể in(K[0], K[-1])
. Tôi không biết liệu điều đó sẽ tiết kiệm, mặc dù.