当前位置: 首页 > 编程笔记 >

C ++中具有3个数组元素的特殊三元组的总和

董良策
2023-03-14
本文向大家介绍C ++中具有3个数组元素的特殊三元组的总和,包括了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变量并返回最终的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
 类似资料:
  • 本文向大家介绍C#中数组的指定维中的元素总数,包括了C#中数组的指定维中的元素总数的使用技巧和注意事项,需要的朋友参考一下 要获取数组指定维度中的元素总数,代码如下- 示例 输出结果 这将产生以下输出- 现在让我们来看另一个示例- 示例 输出结果 这将产生以下输出-

  • 问题内容: 给定下面的数组,我想知道是否有一种简单的方法可以将此数组转换为仅具有唯一值的数组? 给出: 将其变成这样的结果数组,保留原始顺序: 问题答案: 在Java 8中,用于获取数组的唯一元素 最简单的方法是从数组创建集合。 然后您可以使用以下方法检索数组: 如果要维护订单,请使用 LinkedHashSet; 如果要对订单进行排序,请使用 TreeSet 。

  • 问题内容: 在JavaScript中,我想不出代码来从n个数组(其中m个元素)中生成组合的代码。对于其他语言,我也曾见过类似的问题,但答案包含了我不确定如何翻译的语法或库魔术。 考虑以下数据: 3个数组,其中包含不同数量的元素。我想做的是通过组合每个数组中的一项来获得所有组合。 例如: 等等。 如果数组的数目是固定的,则很容易进行硬编码实现。但是数组的数量可能会有所不同: 任何帮助将非常感激。 问

  • 问题内容: 我的文件很大,预计约为12 GB。我想将它们全部加载到功能强大的具有16 GB RAM的64位计算机上的内存中,但是我认为Java不支持那么大的字节数组: Java有可能吗? Eclipse编译器的编译错误是: javac给出: 问题答案: Java数组索引的类型(4个字节或32位),因此恐怕您的数组只能使用2 31 − 1或2147483647个插槽。我将数据读入另一个数据结构,例如

  • 我想用Java做一个小游戏swing,但我想不出一个解决问题的好方法。我有两个阵列,第一个是板条箱 第二个是Tile对象。 我想检查一下是否所有的板条箱都放在瓷砖上。我的意思是,不管哪个盒子在哪个瓷砖上,都有几个盒子,几个瓷砖,每个盒子都应该放在一块瓷砖上,不管哪个盒子在哪个瓷砖上。在游戏中,玩家行走并移动箱子,所以他们的坐标会发生变化。瓷砖坐标不变(如果可能有帮助的话)。这将是我的停止状态。当板

  • 问题内容: 快速找到整数数组总和的最简单(最佳)方法是什么?我有一个称为倍数的数组,我想知道倍数的总和。 问题答案: 这是我能找到的最简单/最短的方法。 Swift 3和Swift 4: 斯威夫特2: 更多信息: 这使用了Array的reduce方法(在此处提供文档),该方法允许您“通过递归应用所提供的闭包将元素的集合减少到单个值”。我们给它0作为初始值,然后本质上给闭包赋值。当然,我们可以将其简