Questa sfida va da un test di ammissione a un corso di cyber security a numero chiuso. Comunque non ha a che fare con la sicurezza informatica, è solo per testare le abilità logiche e di programmazione degli studenti.
Compito
Scrivi un programma che rimuove le voci da un array in modo che i valori rimanenti siano ordinati in un ordine strettamente decrescente e la loro somma sia massimizzata tra tutte le altre possibili sequenze decrescenti.
Ingresso e uscita
L'input sarà un array di valori interi rigorosamente maggiori di 0
e tutti diversi l'uno dall'altro . Sei libero di scegliere se leggere l'input dal file, dalla riga di comando o dallo stdin.
L'output sarà in ordine decrescente subarray in di quello in input, la cui somma è maggiore di qualsiasi altro subarray in ordine decrescente.
Nota: [5, 4, 3, 2]
è un sottoarray di [5, 4, 1, 3, 2]
, anche se 4
e 3
non sono adiacenti. Solo perché è 1
stato fatto scoppiare.
Soluzione Bruteforce
La soluzione più semplice, naturalmente, sarebbe iterare tra tutte le possibili combinazioni dell'array dato e cercarne una ordinata con la somma maggiore, che sarebbe, 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
Sfortunatamente, poiché controllando se l'array è ordinato e calcolando la somma dei suoi elementi è e poiché questa operazione verrà eseguita volte per da a , la complessità del tempo asintotico sarà
Sfida
Il tuo obiettivo è ottenere una migliore complessità temporale rispetto alla forza bruta di cui sopra. La soluzione con la più piccola complessità temporale asintotica è la vincitrice della sfida. Se due soluzioni hanno la stessa complessità temporale asintotica, il vincitore sarà quello con la minore complessità spaziale asintotica.
Nota: puoi prendere in considerazione la lettura, la scrittura e il confronto atomico anche su grandi numeri.
Nota: se ci sono due o più soluzioni, restituire una di esse.
Casi test
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]