मान लीजिए कि हमारे पास धनात्मक पूर्णांकों के दो सरणियाँ X और Y हैं। ऐसे युग्मों की संख्या ज्ञात कीजिए कि x^y> y^x, जहाँ x, X का एक अवयव है और y, Y का एक अवयव है। मान लीजिए X =[2, 1, 6], और Y =[1, 5] , तो आउटपुट 3 होगा। चूंकि तीन जोड़े हैं, ये हैं (2, 1), (2, 5) और (6, 1)
हम इसे एक कुशल तरीके से हल कर सकते हैं। तर्क सरल है, यह तब होगा जब y> x फिर x^y> y^x कुछ अपवादों के साथ। तो यह है ट्रिक।
-
सरणी Y को क्रमबद्ध करें
-
X में प्रत्येक अवयव x के लिए, हमें Y में x से बड़ी सबसे छोटी संख्या का सूचकांक ज्ञात करना होगा। ऐसा करने के लिए हम बाइनरी खोज का उपयोग करेंगे। अन्यथा हम अपर_बाउंड () फ़ंक्शन का भी उपयोग कर सकते हैं।
-
पाए गए इंडेक्स के बाद की सभी संख्याएं संबंध को संतुष्ट करती हैं, इसलिए बस उसे गिनती में जोड़ें।
उदाहरण
#include <iostream>
#include <algorithm>
using namespace std;
int count(int x, int Y[], int n, int no_of_y[]) {
if (x == 0)
return 0;
if (x == 1)
return no_of_y[0];
int* index = upper_bound(Y, Y + n, x);
int ans = (Y + n) - index;
ans += (no_of_y[0] + no_of_y[1]);
if (x == 2)
ans -= (no_of_y[3] + no_of_y[4]);
if (x == 3)
ans += no_of_y[2];
return ans;
}
int howManyPairs(int X[], int Y[], int m, int n) {
int no_of_y[5] = {0};
for (int i = 0; i < n; i++)
if (Y[i] < 5)
no_of_y[Y[i]]++;
sort(Y, Y + n);
int total_pairs = 0;
for (int i=0; i< m; i++)
total_pairs += count(X[i], Y, n, no_of_y);
return total_pairs;
}
int main() {
int X[] = {2, 1, 6};
int Y[] = {1, 5};
int m = sizeof(X)/sizeof(X[0]);
int n = sizeof(Y)/sizeof(Y[0]);
cout << "Total pair count: " << howManyPairs(X, Y, m, n);
} आउटपुट
Total pair count: 3