Цей виклик - від іспиту на вступ до закритого курсу з кібербезпеки. У будь-якому разі це не має відношення до кібербезпеки, це лише перевірити логічність та навички кодування студентів.
Завдання
Напишіть програму, яка вилучає записи з масиву, щоб решта значень були відсортовані у строго зменшуваному порядку, а їх сума максимальна серед усіх інших можливих послідовностей, що зменшуються.
Вхід і вихід
Вхідний буде масив цілочисельних значень строго більше , ніж 0
та все відрізняються один від одного . Ви можете вибирати чи читати вхідні дані з файлу, командного рядка чи stdin.
Виходом буде низхідне відсортоване підмасив вхідного, сума якого більша, ніж будь-який інший можливий низхідний сортований підмасив.
Примітка: [5, 4, 3, 2]
це підмасив [5, 4, 1, 3, 2]
, навіть якщо 4
і 3
не є суміжним. Просто тому, що 1
вискочив.
Розчин грубої сили
Найпростішим рішенням, звичайно, було б ітерація серед усіх можливих комбінацій даного масиву та пошук відсортованого з найбільшою сумою, що було б у 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
На жаль, оскільки перевірка сортування масиву та обчислення суми його елементів є, і оскільки ця операція буде виконана разів від з до , асимптотична часова складність буде
Виклик
Ваша мета - досягти кращої складності в часі, ніж жорстока сила вище. Рішення з найменшою асимптотичною часовою складністю є переможцем виклику. Якщо два рішення мають однакову асимптотичну часову складність, виграє той, що має найменшу асимптотичну просторову складність.
Примітка. Ви можете розглянути можливість читання, запису та порівняння атомних навіть у великій кількості.
Примітка. Якщо є два або більше рішення, поверніть будь-яке з них.
Тестові справи
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]