Bu zorluk, kabul testinden kapalı siber güvenlik kursuna. Her neyse, siber güvenlik ile ilgili değil, sadece öğrencilerin mantıksal ve kodlama becerilerini test etmek.
Görev
Bir diziden girdileri kaldıran bir program yazın, böylece kalan değerler kesinlikle azalan bir sıraya göre sıralanır ve toplamları olası diğer azalan sıralar arasında en üst düzeye çıkarılır.
Giriş ve çıkış
Girdi , birbirinden kesinlikle daha büyük 0
ve hepsi birbirinden farklı bir tamsayı değerleri dizisi olacaktır . Dosyadan, komut satırından veya stdin'den girdiyi okumayı seçebilirsiniz.
Çıkış , bir olacaktır inen-sıralanmış Toplam, diğer olası inen-kriteri alt dizisinde daha büyük olan giriş birine göre altdizilim.
Not: [5, 4, 3, 2]
bir subarrav [5, 4, 1, 3, 2]
bile, 4
ve 3
bitişik değildir. Çünkü 1
patladı.
Bruteforce çözümü
Tabii ki en basit çözüm, verilen dizinin tüm olası kombinasyonları arasında yineleme yapmak ve Python'da en büyük toplamı olan sıralı bir tane aramak olacaktır :
import itertools
def best_sum_desc_subarray(ary):
best_sum_so_far = 0
best_subarray_so_far = []
for k in range(1, len(ary)):
for comb in itertools.combinations(ary, k):
if sum(comb) > best_sum_so_far and all(comb[j] > comb[j+1] for j in range(len(comb)-1)):
best_subarray_so_far = list(comb)
best_sum_so_far = sum(comb)
return best_subarray_so_far
Maalesef, dizi sıralanır eğer kontrol ve 's elemanlarının toplamını hesaplayarak beri edilir ve bu operasyon beri yapılacaktır için kez gelen üzere , asimptotik zaman karmaşıklığı olacak
Meydan okuma
Amacınız yukarıdaki kaba kuvvetten daha iyi bir zaman karmaşıklığı elde etmektir. En küçük asimptotik zaman karmaşıklığına sahip çözüm, mücadelenin kazananıdır. İki çözüm aynı asimtotik zaman karmaşıklığına sahipse, kazanan en küçük asimtotik uzamsal karmaşıklığa sahip olan olacaktır.
Not: Çok sayılarda bile atomik okumayı, yazmayı ve karşılaştırmayı düşünebilirsiniz .
Not: İki veya daha fazla çözüm varsa ikisinden birini döndürün.
Test senaryoları
Input: [200, 100, 400]
Output: [400]
Input: [4, 3, 2, 1, 5]
Output: [4, 3, 2, 1]
Input: [50, 40, 30, 20, 10]
Output: [50, 40, 30, 20, 10]
Input: [389, 207, 155, 300, 299, 170, 158, 65]
Output: [389, 300, 299, 170, 158, 65]
Input: [19, 20, 2, 18, 13, 14, 8, 9, 4, 6, 16, 1, 15, 12, 3, 7, 17, 5, 10, 11]
Output: [20, 18, 16, 15, 12, 7, 5]
Input: [14, 12, 24, 21, 6, 10, 19, 1, 5, 8, 17, 7, 9, 15, 23, 20, 25, 11, 13, 4, 3, 22, 18, 2, 16]
Output: [24, 21, 19, 17, 15, 13, 4, 3, 2]
Input: [25, 15, 3, 6, 24, 30, 23, 7, 1, 10, 16, 29, 12, 13, 22, 8, 17, 14, 20, 11, 9, 18, 28, 21, 26, 27, 4, 2, 19, 5]
Output: [25, 24, 23, 22, 17, 14, 11, 9, 4, 2]