Este desafío es desde una prueba de admisión hasta un curso de seguridad cibernética de número cerrado. De todos modos, no tiene que ver con la seguridad cibernética, es solo para evaluar las habilidades lógicas y de codificación de los estudiantes.
Tarea
Escriba un programa que elimine entradas de una matriz para que los valores restantes se ordenen en un orden estrictamente decreciente y su suma se maximice entre todas las demás secuencias decrecientes posibles.
Entrada y salida
De entrada será una matriz de valores de número entero estrictamente mayor que 0
y todos diferentes unos de otros . Usted es libre de elegir si desea leer la entrada del archivo, línea de comando o stdin.
La salida será un subconjunto ordenado descendente del de entrada, cuya suma es mayor que cualquier otro subconjunto ordenado descendente posible.
Nota: [5, 4, 3, 2]
es un subconjunto de [5, 4, 1, 3, 2]
, incluso si 4
y 3
no son adyacentes. Solo porque el 1
estalló.
Solución de fuerza bruta
La solución más simple, por supuesto, sería iterar entre todas las combinaciones posibles de la matriz dada y buscar una ordenada con la mayor suma, que sería, en 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
Por desgracia, ya comprobar si se ordena la matriz y el cálculo de la suma de sus elementos es y ya que esta operación se hará veces para partir a la complejidad asintótica tiempo será
Desafío
Su objetivo es lograr una mejor complejidad de tiempo que la fuerza bruta anterior. La solución con la menor complejidad asintótica del tiempo es la ganadora del desafío. Si dos soluciones tienen la misma complejidad asintótica del tiempo, el ganador será el que tenga la menor complejidad espacial asintótica.
Nota: puede considerar leer, escribir y comparar atómica incluso en grandes cantidades.
Nota: Si hay dos o más soluciones, devuelva cualquiera de ellas.
Casos de prueba
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]
Respuestas:
Perl
Esto debería ser O (n ^ 2) en el tiempo y O (n) en el espacio
Dar números separados por espacio en una línea a STDIN
fuente
Cómo funciona
bestSubarrays xs
es la secuencia de subconjuntosxs
que se encuentran en la frontera eficiente de {suma más grande, primer elemento más pequeño}, ordenados de izquierda a derecha aumentando la suma y aumentando el primer elemento.Para ir de
bestSubarrays xs
abestSubarrays (x:xs)
, nosotrosx
, y un lado derecho con primeros elementos mayores quex
,x
la submatriz más a la derecha en el lado izquierdo,fuente
Esta respuesta se expande sobre la de Ton Hospel.
El problema se puede resolver con programación dinámica utilizando la recurence
Pruébalo en línea!
fuente