이 과제는 입학 시험부터 비공개 사이버 보안 코스까지입니다. 어쨌든 사이버 보안과 관련이 없으며 학생들에게 논리적이고 코딩 기술을 테스트하는 것입니다.
직무
나머지 값이 엄격하게 감소하는 순서로 정렬되고 가능한 모든 감소하는 시퀀스 중에서 합계가 최대화되도록 배열에서 항목을 제거하는 프로그램을 작성하십시오.
입력과 출력
입력은 정수 값의 배열 될 것이다 엄격히 더 이상 0
모두 서로 다르다 . 파일, 명령 행 또는 stdin에서 입력을 읽을 지 여부를 자유롭게 선택할 수 있습니다.
출력 은 입력 항목 의 내림차순으로 정렬 된 하위 배열이되며 그 합은 다른 가능한 내림차순으로 정렬 된 하위 배열보다 큽니다.
참고 : [5, 4, 3, 2]
의 부분 배열 인 [5, 4, 1, 3, 2]
경우에도, 4
그리고이 3
인접하지 않은. 그냥 터 졌기 때문에 1
.
Bruteforce 솔루션
물론 가장 간단한 해결책은 주어진 배열의 모든 가능한 조합 사이를 이동을하고에, 될 가장 큰 합과 정렬 된 하나를 검색 할 파이썬 :
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
불행하게도, 배열이 정렬되어 있는지 확인하고 요소의 합을 계산하는 것은 이 작업이 에서 ~ 까지의 시간에 수행 되므로 점근 적 시간 복잡도는
도전
당신의 목표는 위의 bruteforce보다 더 나은 시간 복잡성을 달성하는 것입니다. 가장 작은 점근 적 시간 복잡도를 가진 솔루션이 도전의 승자입니다. 두 솔루션이 동일한 점근 시간 복잡도를 갖는 경우 가장 작은 점근 공간 복잡도가 가장 큰 솔루션이 승자가됩니다.
참고 : 다수의 원자 에서도 읽기, 쓰기 및 비교를 고려할 수 있습니다 .
참고 : 둘 이상의 솔루션이있는 경우 둘 중 하나를 반환하십시오.
테스트 사례
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]