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

這個問題的一個簡單解決方案是從陣列中生成所有三元組。對於所有特殊三元組,使用上述公式計算其值。然後將它們新增到一個sum變數中,並返回最終的和。

示例

說明解決方案的程式,

 即時演示

#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中索引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<<"Sum of special triplets = "<<findSpecialTripletSum(A, B, C, sizeA, sizeB, sizeC);
}

輸出

Sum of special triplets = 747

更新於:2020年8月5日

135次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.