Thử thách này là từ một bài kiểm tra nhập học đến một khóa học an ninh mạng số kín. Dù sao, nó không liên quan đến an ninh mạng, nó chỉ để kiểm tra các kỹ năng mã hóa và logic của sinh viên.
Bài tập
Viết chương trình loại bỏ các mục từ một mảng để các giá trị còn lại được sắp xếp theo thứ tự giảm nghiêm ngặt và tổng của chúng là tối đa trong số tất cả các chuỗi giảm có thể khác.
Đầu vào và đầu ra
Đầu vào sẽ là một mảng các giá trị nguyên lớn hơn 0
và hoàn toàn khác nhau . Bạn có thể tự do chọn đọc đầu vào từ tệp, dòng lệnh hoặc stdin.
Đầu ra sẽ là một phân đoạn được sắp xếp giảm dần của một đầu vào, có tổng lớn hơn bất kỳ phân đoạn giảm dần được sắp xếp có thể khác.
Lưu ý: [5, 4, 3, 2]
là một phân khúc của [5, 4, 1, 3, 2]
, ngay cả khi 4
và 3
không liền kề. Chỉ vì 1
đã được bật lên.
Dung dịch bruteforce
Tất nhiên, giải pháp đơn giản nhất sẽ được lặp lại trong số tất cả các kết hợp có thể có của mảng đã cho và tìm kiếm một thứ tự được sắp xếp với tổng lớn nhất, đó sẽ là, trong 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
Thật không may, vì kiểm tra xem mảng có được sắp xếp hay không và tính tổng của các phần tử của nó và vì thao tác này sẽ được thực hiện theo thời gian từ đến , độ phức tạp thời gian tiệm cận sẽ là
Thử thách
Mục tiêu của bạn là đạt được độ phức tạp thời gian tốt hơn so với bruteforce ở trên. Giải pháp với độ phức tạp thời gian tiệm cận nhỏ nhất là người chiến thắng thử thách. Nếu hai giải pháp có độ phức tạp thời gian tiệm cận giống nhau, người chiến thắng sẽ là người có độ phức tạp không gian tiệm cận nhỏ nhất.
Lưu ý: Bạn có thể xem xét việc đọc, viết và so sánh nguyên tử ngay cả trên số lượng lớn.
Lưu ý: Nếu có hai hoặc nhiều giải pháp trả về một trong hai giải pháp.
Các trường hợp thử nghiệm
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]