কম্পিউটার

পাইথনে যেকোন স্থানচ্যুতি থেকে প্রাপ্ত সর্বাধিক যোগফল খুঁজে বের করার প্রোগ্রাম


ধরুন আমাদের একটি অ্যারে সংখ্যা আছে, এবং আরেকটি অ্যারে যাকে অনুরোধ বলা হয় যেখানে অনুরোধ [i] =[start_i, end_i], এটি ith অনুরোধটি nums[start_i] + nums[start_i+1] + ... + এর যোগফলের জন্য অনুরোধ করে। সংখ্যা[end_i-1] + nums[end_i]। আমাদের সংখ্যার সমস্ত অনুক্রমের মধ্যে সমস্ত অনুরোধের সর্বাধিক মোট যোগফল খুঁজে বের করতে হবে। উত্তরটি অনেক বড় হতে পারে, তাই এটি মডিউল 10^9+7 ফেরত দিন।

সুতরাং, ইনপুট যদি সংখ্যার মত হয় =[10,20,30,40,50] অনুরোধ =[[1,3],[0,1]], তাহলে আউটপুট হবে 190, কারণ যদি আমরা [30] এর মতো সাজাই। ,50,40,20,10] আমরা পাই:অনুরোধ থেকে[0] :nums[1] + nums[2] + nums[3] =50 + 40 + 20 =110, এবং অনুরোধ থেকে[1] :nums[ 0] + সংখ্যা[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]
        -এর শেষে
      • ঢোকান (প্রি, পি-1)
      • প্রে :=p
  • অন্যথায় যখন পতাকা 1 এর মত হয়, তখন
    • cnt :=cnt - r
    • fr[cnt+r] এর শেষে সন্নিবেশ (প্রি, পি)
    • প্রি:=p+1
  • i :=i + 1
  • বিপরীত ক্রমে তালিকার সংখ্যাগুলি সাজান
  • ks :=fr-এর সমস্ত কীগুলির তালিকা থেকে একটি নতুন তালিকা
  • বিপরীত ক্রমে তালিকা ks সাজান
  • উত্তর :=0
  • m :=10^9 + 7
  • i :=0
  • ks-এ প্রতিটি k-এর জন্য,
      করুন
    • fr[k] তে প্রতিটি জোড়ার (s, e) জন্য, করুন
      • d :=e - s + 1
      • উত্তর :=উত্তর + (সংখ্যার সমস্ত উপাদানের যোগফল[সূচি i থেকে i+d-1]) * k
      • উত্তর :=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. পাইথনে বাইনারি ট্রির যেকোন পথের বৃহত্তম যোগফল খুঁজে বের করার প্রোগ্রাম

    2. পাইথন প্রোগ্রামে অ্যারের সমষ্টি খুঁজুন

    3. পাইথন প্রোগ্রাম একটি তালিকার ক্রমবর্ধমান যোগফল খুঁজে বের করতে

    4. অ্যারের যোগফল খুঁজে পেতে পাইথন প্রোগ্রাম