Program to find maximum sum obtained of any permutation in Python

Suppose we have an array nums, and another array called requests where requests[i] = [start_i, end_i], this represents the ith request asks for the sum of nums[start_i] + nums[start_i+1] + ... + nums[end_i-1] + nums[end_i]. We have to find the maximum total sum of all requests among all permutations of nums. The answer may be very large, so return it modulo 10^9+7.

So, if the input is like nums = [10,20,30,40,50] requests = [[1,3],[0,1]], then the output will be 190, because if we arrange like [30,50,40,20,10] we get: from requests[0] : nums[1] + nums[2] + nums[3] = 50 + 40 + 20 = 110, and from requests[1] : nums[0] + nums[1] = 30 + 50 = 80, so total sum 110+80 = 190.

To solve this, we will follow these steps:

  • A := a new list
  • for each request (s, e) in requests, do
    • insert pair (s, 0) at the end of A
    • insert pair (e, 1) at the end of A
  • sort the list A
  • fr := an empty map
  • cnt := 0
  • n := size of A
  • i := 0
  • while i
  • r := 1
  • while i
  • r := r + 1
  • i := i + 1
  • cnt := cnt + r
  • if cnt - r > 0, then
    • insert (pre, p-1) at the end of fr[cnt-r]
      • pre := p
  • otherwise when flag is same as 1, then
    • cnt := cnt - r
    • insert (pre, p) at the end of fr[cnt+r]
    • pre := p+1
  • i := i + 1
  • sort the list nums in reverse order
  • ks := a new list from list of all keys of fr
  • sort the list ks in reverse order
  • ans := 0
  • m := 10^9 + 7
  • i := 0
  • for each k in ks, do
    • for each pair (s, e) in fr[k], do
      • d := e - s + 1
      • ans := ans + (sum of all elements of nums[from index i to i+d-1]) * k
      • ans := ans mod m
      • i := i + d
  • return ans
  • Example

    Let us see the following implementation to get better understanding −

    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  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))

    Input

    [10,20,30,40,50],[[1,3],[0,1]]

    Output

    190
    Updated on: 2021-10-04T09:44:48+05:30

    548 Views

    Kickstart Your Career

    Get certified by completing the course

    Get Started
    Advertisements