Diese Herausforderung reicht von einem Zulassungstest bis zu einem Cyber-Sicherheitskurs mit geschlossenen Nummern. Wie auch immer, es hat nichts mit Cybersicherheit zu tun, sondern dient nur dazu, die logischen Fähigkeiten und die Codierungsfähigkeiten der Schüler zu testen.
Aufgabe
Schreiben Sie ein Programm, das Einträge aus einem Array entfernt, sodass die verbleibenden Werte in einer streng absteigenden Reihenfolge sortiert werden und ihre Summe die unter allen anderen möglichen absteigenden Folgen maximierte ist.
Ein- und Ausgang
Eingang wird ein Array von ganzzahligen Werten sein streng größer als 0
und alle voneinander verschieden . Sie können frei wählen, ob Sie Eingaben aus einer Datei, einer Befehlszeile oder stdin lesen möchten.
Die Ausgabe ist eine absteigend sortierte Unteranordnung der Eingabe, deren Summe größer ist als jede andere mögliche absteigend sortierte Unteranordnung.
Hinweis: [5, 4, 3, 2]
ist ein Subarray von [5, 4, 1, 3, 2]
, auch wenn 4
und 3
nicht benachbart sind. Nur weil das 1
geknallt war.
Bruteforce-Lösung
Die einfachste Lösung wäre natürlich, unter allen möglichen Kombinationen des gegebenen Arrays zu iterieren und nach einem sortierten mit der größten Summe zu suchen, das wäre in Python :
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
Leider ist die Komplexität der asymptotischen Zeit , da überprüft wird, ob das Array sortiert ist und die Summe seiner Elemente berechnet wird, und da diese Operation Zeiten für von bis durchgeführt wird
Herausforderung
Ihr Ziel ist es, eine bessere Zeitkomplexität als die oben genannte Bruteforce zu erreichen. Die Lösung mit der geringsten asymptotischen Zeitkomplexität ist der Gewinner der Herausforderung. Wenn zwei Lösungen dieselbe asymptotische zeitliche Komplexität aufweisen, ist der Gewinner diejenige mit der geringsten asymptotischen räumlichen Komplexität.
Hinweis: Sie betrachten können , das Lesen, Schreiben und Vergleichen Atom auch auf große Zahlen.
Hinweis: Wenn zwei oder mehr Lösungen vorhanden sind, geben Sie eine davon zurück.
Testfälle
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]
Antworten:
Perl
Dies sollte O (n ^ 2) in der Zeit und O (n) im Raum sein
Geben Sie STDIN durch Leerzeichen getrennte Zahlen in einer Zeile
quelle
Wie es funktioniert
bestSubarrays xs
ist die Folge von Subarraysxs
an der effizienten Grenze von {größte Summe, kleinstes erstes Element}, geordnet von links nach rechts durch Erhöhen der Summe und Erhöhen des ersten Elements.Um von
bestSubarrays xs
zu gehenbestSubarrays (x:xs)
, wirx
und eine rechte Seite mit ersten Elementen größer als aufx
.x
dem Subarray ganz rechts auf der linken Seite voranstellen.quelle
Diese Antwort erweitert die Antwort von Ton Hospel.
Das Problem kann mit der dynamischen Programmierung unter Verwendung der Rekursion gelöst werden
Probieren Sie es online!
quelle