Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

K-Concatenation C++ में अधिकतम योग

मान लीजिए कि हमारे पास एक पूर्णांक सरणी गिरफ्तारी और एक पूर्णांक k है, हमें सरणी को k बार दोहराकर बदलना होगा। तो अगर arr =[1, 2] और k =3 तो संशोधित सरणी [1, 2, 1, 2, 1, 2] होगी।

अब हमें संशोधित सरणी में अधिकतम उप-सरणी योग खोजना होगा। ध्यान दें कि उप-सरणी की लंबाई 0 हो सकती है और उस स्थिति में इसका योग 0 है। चूंकि उत्तर बहुत बड़ा हो सकता है, उत्तर मॉड्यूलो 10^9 + 7. खोजें।

तो अगर इनपुट [1,-2,1] और k =5 जैसा है, तो परिणाम 2 होगा।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • GetKadane () नामक विधि को परिभाषित करें, यह सरणी लेगा, यह काम करेगा -

  • ret :=-inf, sum :=0, ret और sum के सभी मान मॉड 10^9 + 7

    के होंगे
  • मेरे लिए 0 से लेकर एआर के आकार तक - 1

    • योग :=अधिकतम गिरफ्तारी [i] और गिरफ्तारी [i] + राशि

    • रिट :=अधिकतम रिट, योग

  • अगर रिट <0 है, तो 0 लौटाएं, अन्यथा रिटायर करें

  • GetSum () नामक विधि को परिभाषित करें, यह सरणी लेगा, यह काम करेगा -

  • ret :=0, ret value mod 10^9 + 7

    . का होगा
  • मेरे लिए 0 से लेकर एआर के आकार तक - 1

    • रिट :=रिट + एआर [i]

  • वापसी रिट

  • GetPrefix() नामक विधि को परिभाषित करें, यह सरणी लेगा, यह इस तरह काम करेगा -

  • ret :=-inf, sum :=0, ret और sum के सभी मान मॉड 10^9 + 7

    के होंगे
  • मेरे लिए 0 से लेकर एआर के आकार तक - 1

    • योग:=योग + गिरफ्तारी [i]

    • रिट :=अधिकतम रिट और योग

  • अगर रिट <0 है, तो 0 लौटाएं, अन्यथा रिटायर करें

  • GetSuffix() नामक विधि को परिभाषित करें, यह सरणी लेगा, यह काम करेगा -

  • ret :=inf, sum :=0, ret और sum के सभी मान mod 10^9 + 7

    के होंगे
  • मेरे लिए एआर के रेंज आकार में - 1 से 0 तक

    • योग:=योग + गिरफ्तारी [i]

    • रिट :=अधिकतम रिट और योग

  • अगर रिट <0 है, तो 0 लौटाएं, अन्यथा रिटायर करें

  • मुख्य विधि से, निम्न कार्य करें -

  • kadane:=getKadane(arr), sum:=getSum(arr), उपसर्ग:=getPrefix(arr), प्रत्यय:=getSuffix(arr)

  • अगर k 1 है, तो kadane वापस करें

  • अगर योग> 1, तो अधिकतम (योग * (के - 2)) + उपसर्ग + प्रत्यय और कडाने

    लौटाएं
  • अन्यथा अधिकतम (उपसर्ग + प्रत्यय) और कडाने

    . लौटाएं

उदाहरण(C++)

आइए एक बेहतर समझ प्राप्त करने के लिए निम्नलिखित कार्यान्वयन देखें -

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
const int MOD = 1e9 + 7;
int add(lli a, lli b){
   return ((a % MOD) + (b % MOD)) % MOD;
}
int mul(lli a, lli b){
   return ((a % MOD) * (b % MOD)) % MOD;
}
class Solution {
   public:
   int getKadane(vector <int>& arr){
      int ret = INT_MIN;
      int sum = 0;
      for(int i = 0; i < arr.size(); i++){
         sum = max(arr[i], arr[i] + sum);
         ret = max(ret, sum);
         sum %= MOD;
         ret %= MOD;
      }
      return ret < 0? 0 : ret;
   }
   int getSum(vector <int>& arr){
      int ret = 0;
      for(int i = 0; i < arr.size(); i++){
         ret += arr[i];
         ret %= MOD;
      }
      return ret;
   }
   int getPrefix(vector <int>& arr){
      int ret = INT_MIN;
      int sum = 0;
      for(int i = 0; i <arr.size(); i++){
         sum += arr[i];
         sum %= MOD;
         ret = max(ret, sum);
         ret %= MOD;
      }
      return ret < 0 ? 0 : ret;
   }
   int getSuffix(vector <int>& arr){
      int sum = 0;
      int ret = INT_MIN;
      for(int i = arr.size() - 1; i >= 0 ; i--){
         sum += arr[i];
         ret = max(ret, sum);
         sum %= MOD;
         ret %= MOD;
      }
      return ret < 0 ? 0 : ret;
   }
   int kConcatenationMaxSum(vector<int>& arr, int k) {
      int kadane = getKadane(arr);
      int sum = getSum(arr);
      int prefix = getPrefix(arr);
      int suffix = getSuffix(arr);
      if(k == 1) return kadane;
      if(sum > 0){
         return max((int)mul((k-2) , sum) + prefix % MOD + suffix % MOD, kadane);
      } else {
         return max(add(prefix , suffix), kadane);
      }
   }
};
main(){
   vector<int> v1 = {1,-2,1};
   Solution ob;
   cout << (ob.kConcatenationMaxSum(v1, 5));
}

इनपुट

[1,-2,1]
5

आउटपुट

2

  1. C++ में बाइनरी ट्री में अधिकतम सर्पिल योग

    इस समस्या में हमें एक बाइनरी ट्री दिया जाता है। हमारा काम एक प्रोग्राम बनाना है जो C++ में एक बाइनरी ट्री में अधिकतम सर्पिल योग प्राप्त करेगा। सर्पिल योग बाइनरी ट्री का, बाइनरी ट्री के स्पाइरल ट्रैवर्सल में पाए जाने वाले नोड्स का योग होता है। एक पेड़ के सर्पिल ट्रैवर्सल में, नोड्स को रूट से लीफ न

  1. सी ++ में एक सरणी में अधिकतम संतुलन योग

    समस्या कथन एक सरणी को देखते हुए []। उपसर्ग योग का अधिकतम मान ज्ञात करें जो कि गिरफ्तारी में अनुक्रमणिका i के लिए प्रत्यय योग भी है []। उदाहरण यदि इनपुट ऐरे है - Arr[] ={1, 2, 3, 5, 3, 2, 1} तो आउटपुट 11 है - उपसर्ग योग =गिरफ्तारी[0..3] =1 + 2 + 3 + 5 =11 और प्रत्यय योग =गिरफ्तारी[3..6] =5 + 3 +

  1. C++ में किसी सरणी का अधिकतम औसत योग विभाजन

    समस्या कथन एक सरणी को देखते हुए, हम संख्या A की एक पंक्ति को अधिकतम K आसन्न (गैर-रिक्त) समूहों में विभाजित करते हैं, फिर स्कोर प्रत्येक समूह के औसत का योग होता है। अधिकतम स्कोर क्या हो सकता है? उदाहरण यदि इनपुट सरणी {9, 2, 5, 3, 10} है तो हम सरणी को इस प्रकार विभाजित कर सकते हैं - {9} {2, 5, 3} औ