Esse desafio é de um teste de admissão a um curso fechado de segurança cibernética. De qualquer forma, isso não tem a ver com segurança cibernética, é apenas para testar as habilidades lógicas e de codificação dos alunos.
Tarefa
Escreva um programa que remova entradas de uma matriz para que os valores restantes sejam classificados em uma ordem estritamente decrescente e sua soma seja maximizada entre todas as outras sequências decrescentes possíveis.
Entrada e saída
A entrada será uma matriz de valores inteiros estritamente maiores que 0
e todos diferentes entre si . Você pode escolher entre ler a entrada do arquivo, linha de comando ou stdin.
A saída será uma sub - matriz ordenada por ordem decrescente da entrada, cuja soma é maior que qualquer outra sub-matriz ordenada por ordem descendente.
Nota: [5, 4, 3, 2]
é uma sub-matriz de [5, 4, 1, 3, 2]
, mesmo que 4
e 3
não seja adjacente. Só porque o 1
foi estalado.
Solução Bruteforce
A solução mais simples, é claro, seria iterar entre todas as combinações possíveis da matriz fornecida e procurar uma ordenada com a maior soma, ou seja, em 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
Infelizmente, desde que verificar se a matriz é classificada, e calcular a soma de TI de elementos é e desde que esta operação será feito vezes para partir para , a complexidade de tempo assintótica será
Desafio
Seu objetivo é alcançar uma complexidade de tempo melhor do que a força bruta acima. A solução com a menor complexidade de tempo assintótica é a vencedora do desafio. Se duas soluções tiverem a mesma complexidade de tempo assintótica, o vencedor será aquele com a menor complexidade espacial assintótica.
Nota: Você pode considerar ler, escrever e comparar atômica, mesmo em grandes números.
Nota: Se houver duas ou mais soluções, retorne uma delas.
Casos de teste
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]
Respostas:
Perl
Deve ser O (n ^ 2) no tempo e O (n) no espaço
Atribua números separados por espaço em uma linha a STDIN
fonte
Como funciona
bestSubarrays xs
é a sequência de sub-matrizesxs
que estão na fronteira eficiente de {maior soma, menor primeiro elemento}, ordenadas da esquerda para a direita, aumentando a soma e aumentando o primeiro elemento.Para ir de
bestSubarrays xs
parabestSubarrays (x:xs)
, nósx
e um lado direito com os primeiros elementos maiores quex
,x
o subarray mais à direita no lado esquerdo,fonte
Essa resposta se expande na de Ton Hospel.
O problema pode ser resolvido com a programação dinâmica usando a recorrência
Experimente online!
fonte