কম্পিউটার

C++ এ 3টি অ্যারে থেকে উপাদান সম্বলিত বিশেষ ট্রিপলেটের সমষ্টি


এই সমস্যায়, আমাদেরকে 3টি অ্যারে X, Y, Z দেওয়া হয়েছে৷ আমাদের কাজ হল 3টি অ্যারে থেকে উপাদান সম্বলিত বিশেষ ট্রিপলেটগুলির সমষ্টি খুঁজে বের করার জন্য একটি প্রোগ্রাম তৈরি করা৷

বিশেষ ট্রিপলেট একটি বিশেষ ধরনের ট্রিপলেট যা নিম্নলিখিত সম্পত্তি −

ধারণ করে

এর জন্য (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) : value = (5+8) * (8+7) = 195
(5, 8, 1) : value = (5+8) * (8+1) = 117
(4, 8, 7) : value = (4+8) * (8+7) = 180
(4, 8, 1) : value = (4+8) * (8+1) = 108
(5, 6, 1) : value = (5+6) * (6+1) = 77
(4, 6, 1) : value = (4+6) * (6+1) = 70
Sum of special triplets = 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<<"Sum of special triplets = "<<findSpecialTripletSum(X, Y, Z,
   sizeX, sizeY, sizeZ);
}

আউটপুট

Sum of special triplets = 747

আরেকটি আরও কার্যকরী সমাধান হতে পারে অ্যারে X এবং Z সাজানোর মাধ্যমে। তারপর অ্যারের Y-এর প্রতিটি উপাদানের জন্য বিশেষ ট্রিপলেটের প্রয়োজনীয়তা পূরণ করে এমন উপাদানগুলি পরীক্ষা করে দেখুন।

সুতরাং, অ্যারে Y অর্থাৎ Y[i]-এর সূচী 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<<"Sum of special triplets = "<<findSpecialTripletSum(A, B, C, sizeA, sizeB, sizeC);
}

আউটপুট

Sum of special triplets = 747

  1. C++ এ প্রদত্ত অ্যারে থেকে জোড় এবং বিজোড় উপাদান অনুপস্থিত

  2. C++ এ প্রদত্ত তিনটি সাজানো অ্যারে থেকে তিনটি নিকটতম উপাদান খুঁজুন

  3. C++ এ একটি অ্যারেতে অ-পুনরাবৃত্ত (স্বতন্ত্র) উপাদানগুলির সমষ্টি খুঁজুন

  4. অদলবদল করা উপাদানগুলির একটি জোড়া খুঁজুন যা C++ এ দুটি অ্যারের সমষ্টিকে সমান করে তোলে