समस्या विवरण
हमें धनात्मक और ऋणात्मक पूर्णांकों की एक सरणी दी गई है। कार्य सरणी में मौजूद तत्वों के धनात्मक और ऋणात्मक उपसमुच्चयों के बीच अधिकतम अंतर ढूंढना है। चूंकि हमारे पास धनात्मक और ऋणात्मक संख्याओं के उपसमुच्चय हैं, अंतर (धनात्मक का योग) - (ऋणात्मक का योग) हमेशा अधिकतम होगा। ऐसा इसलिए क्योंकि ऋणात्मक को घटाने से वे जुड़ जाएंगे। सभी ऋणात्मक को धनात्मक में बदलकर और सरणी के सभी तत्वों को जोड़ने से वांछित परिणाम प्राप्त होगा।
उदाहरण 1
इनपुट: Arr[] = {-2, 0, -3, 8, 10, 12, -4}
आउटपुट: दो उपसमुच्चयों के बीच अधिकतम अंतर: 39
व्याख्या: धनात्मक पूर्णांक उपसमुच्चय {0, 8, 10, 12} योग 30
ऋणात्मक पूर्णांक उपसमुच्चय {-2, -3, -4} योग -9
अधिकतम अंतर = 30 - (-9) = 39
उदाहरण 2
इनपुट: Arr[] = {-5, -15, -3, -2, 10, 20, 15}
आउटपुट: दो उपसमुच्चयों के बीच अधिकतम अंतर: 70
व्याख्या: धनात्मक पूर्णांक उपसमुच्चय {10, 20, 15} योग 45
ऋणात्मक पूर्णांक उपसमुच्चय {-5, -15, -3, -2} योग -25
अधिकतम अंतर = 45 - (-25) = 70
दृष्टिकोण
- धनात्मक और ऋणात्मक पूर्णांकों वाली पूर्णांक सरणी
Arr[]लें। - फ़ंक्शन
subsetDifference(int arr[], int n)ऋणात्मक और धनात्मक पूर्णांकों के दो उपसमुच्चयों के बीच अधिकतम अंतर ढूंढता है। यह दो तर्क लेता है: सरणी और इसका आकार n। - चर
sum=0सभी तत्वों का योग संग्रहीत करने के लिए। - बाएं से शुरू करके, for लूप (i=0; i
- यदि वर्तमान तत्व ऋणात्मक है (<0), तो -1 से गुणा करके इसे धनात्मक बनाएं (arr[i] = arr[i] * -1)।
- प्रत्येक तत्व को sum में जोड़ें।
- sum को अधिकतम संभव उपसमुच्चय अंतर के रूप में लौटाएं।
C प्रोग्राम उदाहरण
#include <stdio.h>
int subsetDifference(int arr[], int n) {
int sum = 0;
for (int i = 0; i < n; i++) {
if (arr[i] < 0)
arr[i] = arr[i] * -1;
sum += arr[i];
}
return sum;
}
// ड्राइवर कोड
int main() {
int arr[] = {-1, 3, 5, 17, -32, 12};
int n = 6;
printf("Maximized difference between subsets: %d", subsetDifference(arr, n));
return 0;
}
आउटपुट
Maximized difference between two subsets: 70
व्याख्या: {-1, 3, 5, 17, -32, 12} के निरपेक्ष मानों का योग = 1+3+5+17+32+12 = 70।