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

C++ में K-संयोजन अधिकतम योग


मान लीजिए हमारे पास एक पूर्णांक सरणी arr और एक पूर्णांक 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 के मॉड्यूलो होंगे
  • i को 0 से सरणी के आकार - 1 तक लूप करें
    • sum := arr[i] और arr[i] + sum का अधिकतम
    • ret := ret और sum का अधिकतम
  • यदि ret < 0, तो 0 लौटाएं, अन्यथा ret
  • getSum() नामक विधि परिभाषित करें, यह सरणी लेगा, यह निम्नानुसार कार्य करेगा:
  • ret := 0, ret मान 10^9 + 7 के मॉड्यूलो होगा
  • i को 0 से सरणी के आकार - 1 तक लूप करें
    • ret := ret + arr[i]
  • ret लौटाएं
  • getPrefix() नामक विधि परिभाषित करें, यह सरणी लेगा, यह निम्नानुसार कार्य करेगा:
  • ret := -inf, sum := 0, ret और sum के सभी मान 10^9 + 7 के मॉड्यूलो होंगे
  • i को 0 से सरणी के आकार - 1 तक लूप करें
    • sum := sum + arr[i]
    • ret := ret और sum का अधिकतम
  • यदि ret < 0, तो 0 लौटाएं, अन्यथा ret
  • getSuffix() नामक विधि परिभाषित करें, यह सरणी लेगा, यह निम्नानुसार कार्य करेगा:
  • ret := -inf, sum := 0, ret और sum के सभी मान 10^9 + 7 के मॉड्यूलो होंगे
  • i को सरणी के आकार - 1 से 0 तक लूप करें
    • sum := sum + arr[i]
    • ret := ret और sum का अधिकतम
  • यदि ret < 0, तो 0 लौटाएं, अन्यथा ret
  • मुख्य विधि से, निम्नलिखित करें:
    • kadane := getKadane(arr), sum := getSum(arr), prefix := getPrefix(arr), suffix := getSuffix(arr)
    • यदि k = 1, तो kadane लौटाएं
    • यदि , तो max((sum * (k - 2)) + prefix + suffix, kadane) लौटाएं
    • अन्यथा max(prefix + suffix, kadane) लौटाएं

उदाहरण (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++ में बाइनरी ट्री में अधिकतम स्पाइरल सम

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

  1. - C++ में ऐरे में अधिकतम संतुलन योग

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

  1. - C++ में ऐरे का अधिकतम औसत योग पार्टीशन

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