Giriş
Çoğunuz, bir sayı listesini sıralamak için birleştirme sıralama algoritmasını biliyorsunuzdur . Algoritmanın bir parçası olarak, merge
iki sıralı listeyi bir sıralı listede birleştiren bir yardımcı işlev yazılır . Python benzeri sözde kodda, işlev genellikle şöyle görünür:
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
Fikir ilk elemanlarının küçük haşhaş tutmaktır A
ve B
hem listeleri boş olan ve içine sonuçları toplamak kadar C
. Eğer A
ve B
ikisi de sıralanır, sonra böyledir C
.
Tersine, eğer C
bir sıralı liste ve biz herhangi iki alt sıralar bölmek A
ve B
sonra A
ve B
aynı zamanda sıralanır ve merge(A, B) == C
. İlginç bir şekilde, bu C
sıralanmıyorsa, bu zorunlu değildir, bu da bizi bu zorluğa getirir.
Giriş
2*n
Girişiniz [0, 1, 2, ..., 2*n-1]
, bazıları n > 0
için liste olarak verilen ilk negatif olmayan tam sayıların permütasyonudur C
.
Çıktı
İki liste A
ve böyle bir B
uzunluk n
varsa C == merge(A, B)
, çıktınız gerçeğe uygun bir değer ve aksi takdirde bir sahte değer olacaktır. Giriş kopya içermediğinden, merge
işlevde bağların nasıl koptuğu konusunda endişelenmenize gerek yoktur .
Kurallar ve Bonuslar
Bir işlev veya tam bir program yazabilirsiniz. En düşük bayt sayısı kazanır ve standart boşluklara izin verilmez.
Listeleri hesaplamanız gerekmediğini A
ve B
"evet" örneklerinde gerekli olmadığını unutmayın . Ancak, listeleri gerçekten çıkarırsanız, % -20 bonus alırsınız . Bu bonusu talep etmek için, tüm olasılıkları değil, yalnızca bir çift liste çıkarmanız gerekir. Bu bonusun güçlü yazılan dillerde talep edilmesini kolaylaştırmak için, "hayır" örneklerinde bir çift boş liste çıkarılmasına izin verilir.
Kaba zorlama yasak değildir, ancak son dört test vakasının tümünü 1 saniyenin altında hesaplamak için % -10 bonus vardır .
Test Durumları
"Evet" örneklerinde yalnızca bir olası çıktı verilir.
[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])
yazdırabileceğinizi görebilirsiniz(K[0], K[-1])
. Yine de bunun bir tasarruf sağlayıp sağlamadığını bilmiyorum.