Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonの順列から得られる最大合計を見つけるプログラム


配列numsがあり、requests [i] =[start_i、end_i]であるrequestsという別の配列があるとします。これは、i番目の要求がnums [start_i] + nums [start_i + 1] +...+の合計を要求することを表します。 nums [end_i-1] +nums[end_i]。 numのすべての順列の中から、すべての要求の最大合計を見つける必要があります。答えは非常に大きい可能性があるため、10 ^ 9+7を法として返します。

したがって、入力がnums =[10,20,30,40,50]リクエスト=[[1,3]、[0,1]]の場合、出力は190になります。これは、[30 、50,40,20,10]次のようになります:requests [0]から:nums [1] + nums [2] + nums [3] =50 + 40 + 20 =110、およびrequests [1]から:nums [ 0] + nums [1] =30 + 50 =80なので、合計は110 + 80=190です。

これを解決するには、次の手順に従います。

  • A:=新しいリスト
  • リクエスト内のリクエスト(s、e)ごとに、
    • Aの最後にペア(s、0)を挿入します
    • Aの最後にペア(e、1)を挿入します
  • リストAを並べ替える
  • fr:=空の地図
  • cnt:=0
  • n:=Aのサイズ
  • i:=0
  • i
  • r:=1
  • i
  • r:=r + 1
  • i:=i + 1
  • cnt:=cnt + r
  • cnt --r> 0の場合、
    • fr [cnt-r]の最後に(pre、p-1)を挿入します
      • pre:=p
  • それ以外の場合、フラグが1と同じ場合、
    • cnt:=cnt --r
    • fr [cnt + r]の最後に(pre、p)を挿入します
    • pre:=p + 1
  • i:=i + 1
  • リスト番号を逆の順序で並べ替えます
  • ks:=frのすべてのキーのリストからの新しいリスト
  • リストksを逆の順序で並べ替えます
  • ans:=0
  • m:=10 ^ 9 + 7
  • i:=0
  • ks単位のkごとに、
    • fr [k]の各ペア(s、e)について、
      • d:=e --s + 1
      • ans:=ans +(numsのすべての要素の合計[インデックスiからi + d-1まで])* k
      • ans:=ans mod m
      • i:=i + d
  • 回答を返す
  • 理解を深めるために、次の実装を見てみましょう-

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

    入力

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

    出力

    190

    1. リストの累積合計を見つけるPythonプログラム

      この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −リストが与えられたので、累積合計でリストを作成する必要があります。 次に、以下の実装のソリューションを見てみましょう- 例 # cumulative sum def Cumulative(l):    new = []    cumsum = 0    for element in l:       cumsum += element       new.append(cumsum) &

    2. 配列の合計を見つけるPythonプログラム

      この記事では、特定の問題ステートメントを解決するための解決策とアプローチについて学習します。 問題の説明 入力として配列が与えられた場合、与えられた配列の合計を計算する必要があります。 ここでは、ブルートフォースアプローチに従うことができます。つまり、リストをトラバースし、各要素を空の合計変数に追加します。最後に、合計の値を表示します。 以下で説明するように、組み込みの合計関数を使用して別のアプローチを実行することもできます。 例 # main arr = [1,2,3,4,5] ans = sum(arr,n) print ('Sum of the array is '