समस्या विवरण
आपको n इंटीजर का एक ऐरे और एक इंटीजर K दिया गया है। उन कुल अनऑर्डर्ड जोड़े {i, j} की संख्या ढूंढें जैसे कि |ai + aj - k| का निरपेक्ष मान न्यूनतम संभव हो जहां i != j।
उदाहरण
यदि arr[] = {0, 4, 6, 2, 4} और k = 7 तो हम न्यूनतम मान 1 के साथ निम्नलिखित 5 जोड़े बना सकते हैं:
{0, 6}, {4, 2}, {4, 4}, {6, 2}, {2, 4}
एल्गोरिदम
सभी संभावित जोड़ों पर पुनरावृति करें और प्रत्येक जोड़े के लिए जांचें कि (ai + aj - K) का मान हमारे वर्तमान सबसे छोटे मान से कम है या नहीं। उपरोक्त स्थिति के परिणाम के अनुसार हमारे पास कुल तीन मामले हैं -
- abs(ai + aj - K) > smallest - कुछ न करें क्योंकि यह जोड़ा न्यूनतम संभव मान में नहीं गिना जाएगा।
- abs(ai + aj - K) = smallest - न्यूनतम संभव मान वाले जोड़े की गिनती बढ़ाएं।
- abs(ai + aj - K) < smallest - सबसे छोटे मान को अपडेट करें और गिनती को 1 पर सेट करें।
उदाहरण
#include <iostream>
#include <climits>
#include <cmath>
using namespace std;
void getPairs(int *arr, int n, int k) {
int minValue = INT_MAX;
int pairs = 0;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
int val = abs(arr[i] + arr[j] - k);
if (val < minValue) {
minValue = val;
pairs = 1;
} else if (val == minValue) {
++pairs;
}
}
}
cout << "Min value = " << minValue << endl;
cout << "Total pairs = " << pairs << endl;
}
int main() {
int arr[] = {0, 4, 6, 2, 4};
int k = 7;
int n = sizeof(arr) / sizeof(arr[0]);
getPairs(arr, n, k);
return 0;
} आउटपुट
जब आप उपरोक्त प्रोग्राम को कंपाइल और एक्जीक्यूट करते हैं। यह निम्नलिखित आउटपुट उत्पन्न करता है:
Min value = 1 Total pairs = 5