Giả sử chúng ta có một số mảng và một mảng khác được gọi là các yêu cầu trong đó các yêu cầu [i] =[start_i, end_i], điều này đại diện cho yêu cầu thứ i yêu cầu tổng số các số [start_i] + nums [start_i + 1] + ... + nums [end_i-1] + nums [end_i]. Chúng ta phải tìm tổng lớn nhất của tất cả các yêu cầu trong số tất cả các hoán vị của num. Câu trả lời có thể rất lớn, vì vậy hãy trả lại nó theo mô-đun 10 ^ 9 + 7.
Vì vậy, nếu đầu vào là nums =[10,20,30,40,50] request =[[1,3], [0,1]], thì đầu ra sẽ là 190, bởi vì nếu chúng ta sắp xếp như [30 , 50,40,20,10] chúng ta nhận được:từ các yêu cầu [0]:nums [1] + nums [2] + nums [3] =50 + 40 + 20 =110 và từ các yêu cầu [1]:nums [ 0] + nums [1] =30 + 50 =80, do đó tổng cộng 110 + 80 =190.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau:
- A:=một danh sách mới
- đối với mỗi (các) yêu cầu trong các yêu cầu, hãy thực hiện
- chèn (các) cặp vào cuối A
- chèn cặp (e, 1) vào cuối A
- sắp xếp danh sách A
- fr:=một bản đồ trống
- cnt:=0
- n:=kích thước của A
- i:=0
- while i
- r:=1
- trong khi i
- r:=r + 1
- i:=i + 1
- insert (pre, p-1) vào cuối fr [cnt-r]
- pre:=p
- cnt:=cnt - r
- chèn (pre, p) vào cuối fr [cnt + r]
- pre:=p + 1
- đối với mỗi cặp (s, e) trong fr [k], thực hiện
- d:=e - s + 1
- ans:=ans + (tổng tất cả các phần tử của num [từ chỉ số i đến i + d-1]) * k
- ans:=ans mod m
- i:=i + d
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
from collections import defaultdict def solve(nums, requests): A = [] for s, e in requests: A.append((s, 0)) A.append((e, 1)) A.sort() fr = defaultdict(list) cnt = 0 n = len(A) i = 0 while i < n: r = 1 while i < n - 1 and A[i+1] == A[i]: r += 1 i += 1 p, flag = A[i] if flag == 0: cnt += r if cnt - r > 0: fr[cnt-r].append((pre, p-1)) pre = p elif flag == 1: cnt -= r fr[cnt+r].append((pre, p)) pre = p+1 i += 1 nums.sort(reverse=True) ks = list(fr.keys()) ks.sort(reverse=True) ans = 0 m = 10**9 + 7 i = 0 for k in ks: for s, e in fr[k]: d = e - s + 1 ans += sum(nums[i:i+d]) * k ans %= m i += d return ans nums = [10,20,30,40,50] requests = [[1,3],[0,1]] print(solve(nums, requests))
Đầu vào
[10,20,30,40,50],[[1,3],[0,1]]
Đầu ra
190