Giả sử chúng ta có một danh sách các số được gọi là nums. Chúng ta phải tìm tổng nhỏ nhất của x cho mọi danh sách con x tính bằng nums. Nếu câu trả lời quá lớn, hãy sửa đổi kết quả thành 10 ^ 9 + 7.
Vì vậy, nếu đầu vào giống như nums =[5, 10, 20, 10, 0], thì đầu ra sẽ là 90 bởi vì, danh sách con là [[5], [10], [20], [10], [ 0], [5,10], [10,20], [20,10], [10,0], [5,10,20], [10,20,10], [20,10,0] , [5,10,20,10], [10,20,10,0], [5,10,20,10,0]] và giá trị nhỏ nhất của chúng là [5, 10, 20, 10, 0, 5, 10, 10, 0, 5, 10, 0, 5, 0, 0], vì vậy tổng là 90.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- ans:=0
- s:=một danh sách mới
- temp_sum:=0
- đối với mỗi chỉ mục và giá trị trong nums, hãy thực hiện
- while s và value <=phần tử ở chỉ mục 1 của danh sách cuối cùng trong s, thực hiện
- temp_sum:=temp_sum - phần tử ở chỉ mục 2 của danh sách cuối cùng trong s
- xóa phần tử cuối cùng khỏi s
- nếu s trống, thì
- chèn một danh sách có ba phần tử [chỉ mục, giá trị, (chỉ mục + 1) * giá trị] trong s
- nếu không,
- chèn một danh sách có ba phần tử [chỉ mục, giá trị, (chỉ mục - phần tử đầu tiên của danh sách cuối cùng của các s) * giá trị]
- temp_sum:=temp_sum + phần tử ở chỉ mục 2 của danh sách cuối cùng trong s
- ans:=ans + temp_sum
- while s và value <=phần tử ở chỉ mục 1 của danh sách cuối cùng trong s, thực hiện
- return ans mod (10 ^ 9 + 7)
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
def solve(nums): ans = 0 s = [] temp_sum = 0 for index, value in enumerate(nums): while s and value <= s[-1][1]: temp_sum -= s[-1][2] s.pop() if not s: s.append([index, value, (index + 1) * value]) else: s.append([index, value, (index - s[-1][0]) * value]) temp_sum += s[-1][2] ans += temp_sum return ans % (10**9 + 7) nums = [5, 10, 20, 10, 0] print(solve(nums))
Đầu vào
[5, 10, 20, 10, 0]
Đầu ra
90