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

C++ प्रोग्राम में बार-बार संयोजन के बाद बनी सरणी में अधिकतम उपसरणी योग


इस समस्या में, हमें आकार n की एक सरणी arr[] और एक पूर्णांक k दिया गया है। हमारा कार्य एक प्रोग्राम बनाना है जो बार-बार संयोजन के बाद बनी सरणी में अधिकतम उपसरणी योग ढूंढे।

समस्या विवरण

हम उस उपसरणी का अधिकतम योग ढूंढेंगे जो उस सरणी से लिया गया है जो arr को k बार दोहराने के बाद बनती है।

उदाहरण

इनपुट

arr[] = {-9, -5, 14, 6} k = 2

आउटपुट

26

व्याख्या

दोहराने के बाद नई सरणी: {-9, -5, 14, 6, -9, -5, 14, 6} 
अधिकतम योग वाली उपसरणी = {14, 6, -9, -5, 14, 6} 
योग = 26

समाधान दृष्टिकोण

एक सरल समाधान एक नई सरणी बनाना है जो arr[] को k बार संयोजित करके बनेगी, और फिर अधिकतम योग वाली उपसरणी ढूंढना। इसके लिए, सबसे अच्छी विधि कडाने के एल्गोरिदम (Kadane's Algorithm) का उपयोग करना होगा।

उदाहरण

हमारे समाधान के कार्य को दर्शाने वाला प्रोग्राम,

#include <iostream> 
using namespace std; 

int calcMaxSubArraySum(int arr[], int n, int k){ 
    int newArr[2*n]; 
    for(int i = 0; i < k*n; i++) 
        newArr[i] = arr[i%n]; 
    
    int maxSum = -1000, sum = 0; 
    for (int i = 0; i < k*n; i++) { 
        sum = sum + newArr[i]; 
        if (maxSum < sum) 
            maxSum = sum; 
        if (sum < 0) 
            sum = 0; 
    } 
    return maxSum; 
} 

int main(){ 
    int arr[] = { -9, -5, 14, 6 }; 
    int k = 2; 
    int n = sizeof(arr) / sizeof(arr[0]); 
    cout<<"The maximum subarray sum in an array created after repeated concatenation is "<<calcMaxSubArraySum(arr, n, k); 
    return 0; 
}

आउटपुट

The maximum subarray sum in an array created after repeated concatenation is 26

यह दृष्टिकोण अच्छा है लेकिन मॉड्यूलर अंकगणित का उपयोग करके समस्या को हल करने का एक अधिक कुशल दृष्टिकोण संभव है।

मॉड्यूलर अंकगणित (Modular Arithmetic) वह है जब हम समीकरण का शेष प्राप्त करने के लिए मॉड्यूलो ऑपरेटर का उपयोग करते हैं।

समस्या को हल करने के लिए, हम बार-बार संयोजन करके सरणी बनाने के बजाय मॉड्यूलर अंकगणित का उपयोग करेंगे। बाकी समाधान वही रहता है।

उदाहरण

हमारे समाधान के कार्य को दर्शाने वाला प्रोग्राम,

#include <iostream> 
using namespace std; 

int calcMaxSubArraySum(int arr[], int n, int k){ 
    int maxSum = -1000, sum = 0; 
    for (int i = 0; i < k*n; i++) { 
        sum = sum + arr[i%n]; 
        if (maxSum < sum) 
            maxSum = sum; 
        if (sum < 0) 
            sum = 0; 
    } 
    return maxSum; 
} 

int main(){ 
    int arr[] = { -9, -5, 14, 6 }; 
    int k = 2; 
    int n = sizeof(arr) / sizeof(arr[0]); 
    cout<<"The maximum subarray sum in an array created after repeated concatenation is "<<calcMaxSubArraySum(arr, n, k); 
    return 0; 
}

आउटपुट

The maximum subarray sum in an array created after repeated concatenation is 26
  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} और

  1. - दोहराए गए घटाव से सभी तत्वों को समान बनाकर अधिकतम ऐरे योग खोजें C++ में

    मान लीजिए हमारे पास n तत्वों का एक ऐरे है। सभी तत्वों के अधिकतम संभव योग को खोजें जैसे कि सभी तत्व समान हों। केवल अनुमत ऑपरेशन किन्हीं दो तत्वों को चुनना और बड़े को उन दोनों के निरपेक्ष अंतर से बदलना है। मान लीजिए तत्व [9, 12, 3, 6] जैसे हैं। तो आउटपुट 12 होगा। तो पहले A[1] को A[1] - A[3] = 12 - 6 =