Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình tìm tổng lớn nhất thu được của bất kỳ hoán vị nào trong Python

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
  • cnt:=cnt + r
  • nếu cnt - r> 0, thì
    • insert (pre, p-1) vào cuối fr [cnt-r]
      • pre:=p
  • ngược lại khi cờ giống 1, thì
    • cnt:=cnt - r
    • chèn (pre, p) vào cuối fr [cnt + r]
    • pre:=p + 1
  • i:=i + 1
  • sắp xếp các số trong danh sách theo thứ tự ngược lại
  • ks:=một danh sách mới từ danh sách tất cả các khóa của fr
  • sắp xếp ks danh sách theo thứ tự ngược lại
  • ans:=0
  • m:=10 ^ 9 + 7
  • i:=0
  • với mỗi k trong ks, thực hiện
    • đố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
  • trả lại ans
  • 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