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

C++ में 3 सरणियों के तत्वों वाले विशेष त्रिकों का योग


समस्या विवरण

इस समस्या में, हमें 3 सरणी X, Y, Z दी गई हैं। हमारा कार्य 3 सरणियों के तत्वों वाले विशेष त्रिकों (special triplets) का योग ज्ञात करने के लिए एक प्रोग्राम बनाना है।

विशेष त्रिक एक विशेष प्रकार का त्रिक है जो निम्नलिखित गुण रखता है -

(a, b, c) के लिए: a ≤ b और b ≥ c, यानी त्रिक का मध्य तत्व अन्य दो से बड़ा होना चाहिए।

और, त्रिक का मान सूत्र द्वारा दिया जाता है -

f(a, b, c) = (a+b) * (b+c)

इस त्रिक को बनाने के लिए हमें दिए गए तीन सरणियों में से प्रत्येक से एक-एक तत्व का उपयोग करने की आवश्यकता है।

उदाहरण

इनपुट -

X[] = {5, 9, 4} ; Y[] = {8, 6} ; Z[] = {7, 1}

आउटपुट

व्याख्या - आइए सभी विशेष त्रिकों के मान ढूंढते हैं।

(5, 8, 7) : मान = (5+8) * (8+7) = 195
(5, 8, 1) : मान = (5+8) * (8+1) = 117
(4, 8, 7) : मान = (4+8) * (8+7) = 180
(4, 8, 1) : मान = (4+8) * (8+1) = 108
(5, 6, 1) : मान = (5+6) * (6+1) = 77
(4, 6, 1) : मान = (4+6) * (6+1) = 70
विशेष त्रिकों का योग = 747

इस समस्या का एक सरल समाधान सरणी से सभी त्रिकों को उत्पन्न करना है। सभी विशेष त्रिकों के लिए, उपरोक्त सूत्र का उपयोग करके उसका मान गणना करें। और फिर उन्हें एक योग चर में जोड़ें और अंतिम योग वापस करें।

कार्यक्रम उदाहरण (सरल दृष्टिकोण)

#include <iostream>
using namespace std;

int findSpecialTripletSum(int X[], int Y[], int Z[], int sizeX, int sizeY, int sizeZ) {
    int sum = 0;
    for (int i = 0; i < sizeX; i++) {
        for (int j = 0; j < sizeY; j++) {
            for (int k = 0; k < sizeZ; k++) {
                if (X[i] <= Y[j] && Z[k] <= Y[j])
                    sum = sum + (X[i] + Y[j]) * (Y[j] + Z[k]);
            }
        }
    }
    return sum;
}

int main() {
    int X[] = {5, 9, 4};
    int Y[] = {8, 6};
    int Z[] = {7, 1};
    int sizeX = sizeof(X) / sizeof(X[0]);
    int sizeY = sizeof(Y) / sizeof(Y[0]);
    int sizeZ = sizeof(Z) / sizeof(Z[0]);
    cout << "विशेष त्रिकों का योग = " << findSpecialTripletSum(X, Y, Z, sizeX, sizeY, sizeZ);
}

आउटपुट

विशेष त्रिकों का योग = 747

एक और अधिक कुशल समाधान सरणी X और Z को क्रमबद्ध (sort) करके हो सकता है। फिर सरणी Y के प्रत्येक तत्व के लिए उन तत्वों की जांच करें जो विशेष त्रिक की आवश्यकता को पूरा करते हैं।

तो, सरणी Y के इंडेक्स i पर किसी भी तत्व यानी Y[i] के लिए। सरणी X {x1, x2} और Z {z1, z2} के तत्व, Y[i] से कम हैं, तो

मानों का योग,

S = (x1+Y[i])(Y[i]+z1) + (x1+Y[i])(Y[i]+z2) + (x2+Y[i])(Y[i]+z1) + (x2+Y[i])(Y[i]+z2)
S = (x1+Y[i])(Y[i]+z1+Y[i]+z2) + (x2+Y[i])(Y[i]+z1+Y[i]+z2)
S = (2Y[i] + x1 + x2)(2y[i] + z1 + z2)

N = X में Y[i] से बड़े तत्वों की संख्या

M = Z में Y[i] से बड़े तत्वों की संख्या

Sx = X में Y[i] से बड़े तत्वों का योग

Sz = Z में Y[i] से बड़े तत्वों का योग

S = (N*Y[i] + Sx) * (M*Y[i] + Sz)

कार्यक्रम उदाहरण (अनुकूलित दृष्टिकोण)

#include <bits/stdc++.h>
using namespace std;

int tripletSumCalc(int X[], int Y[], int Z[], int prefixSumA[], int prefixSumC[], int sizeA, int sizeB, int sizeC){
    int totalSum = 0;
    for (int i = 0; i < sizeB; i++) {
        int currentElement = Y[i];
        int n = upper_bound(X, X + sizeA, currentElement) - X;
        int m = upper_bound(Z, Z + sizeC, currentElement) - Z;
        if (n == 0 || m == 0)
            continue;
        totalSum += ((prefixSumA[n - 1] + (n * currentElement)) * (prefixSumC[m - 1] + (m * currentElement)));
    }
    return totalSum;
}

int* findPrefixSum(int* arr, int n) {
    int* prefixSumArr = new int[n];
    prefixSumArr[0] = arr[0];
    for (int i = 1; i < n; i++)
        prefixSumArr[i] = prefixSumArr[i - 1] + arr[i];
    return prefixSumArr;
}

int findSpecialTripletSum(int A[], int B[], int C[], int sizeA, int sizeB, int sizeC){
    int specialTripletSum = 0;
    sort(A, A + sizeA);
    sort(C, C + sizeC);
    int* prefixSumA = findPrefixSum(A, sizeA);
    int* prefixSumC = findPrefixSum(C, sizeC);
    return tripletSumCalc(A, B, C, prefixSumA, prefixSumC, sizeA, sizeB, sizeC);
}

int main() {
    int A[] = {5, 9, 4};
    int B[] = {8, 6};
    int C[] = {7, 1};
    int sizeA = sizeof(A) / sizeof(A[0]);
    int sizeB = sizeof(B) / sizeof(B[0]);
    int sizeC = sizeof(C) / sizeof(C[0]);
    cout << "विशेष त्रिकों का योग = " << findSpecialTripletSum(A, B, C, sizeA, sizeB, sizeC);
}

आउटपुट

विशेष त्रिकों का योग = 747
  1. - तीन सॉर्टेड ऐरे से तीन निकटतम तत्व खोजें C++ में

    मान लीजिए हमारे पास तीन सॉर्टेड ऐरे A, B और C हैं, और A, B, C से क्रमशः तीन तत्व i, j, k हैं जैसे कि max(|A[i] – B[j]|, |B[j] – C[k]|, |C[k] – A[i]|) न्यूनतम हो। तो यदि A = [1, 4, 10], B = [2, 15, 20], और C = [10, 12], तो आउटपुट तत्व 10, 15, 10 होंगे, ये A, B और C से हैं। मान लीजिए A, B और C का आकार

  1. - ऐरे में गैर-दोहराए गए (अलग) तत्वों का योग खोजें C++ में

    मान लीजिए हमारे पास कुछ तत्वों के साथ एक ऐरे A है। हमें ऐरे में सभी अलग-अलग तत्वों का योग खोजना है। तो यदि A = [5, 12, 63, 5, 33, 47, 12, 63], तो अलग-अलग तत्वों का योग 160 है। डुप्लीकेट तत्वों को एक बार मानने के बाद बस अनदेखा कर दिया जाता है। हम इस समस्या को कुशलता से हल करने के लिए अनऑर्डर्ड सेट का

  1. - C++ में दो सरणियों के योग को बराबर करने वाली जोड़ी ढूंढें

    समस्या विवरण दो सरणियां दी गई हैं जिनमें अलग-अलग संख्या में तत्व हैं। हमें एक जोड़ी (x, y) ढूंढनी है जहां x पहली सरणी में है और y दूसरी सरणी में है। इस जोड़ी को स्वैप करने के बाद दोनों सरणियों का योग बराबर होना चाहिए। उदाहरण: सरणी A = [4, 1, 2, 2, 1, 1] (योग = 11) और सरणी B = [3, 3, 6, 3] (योग = 1