在C ++中找到可能的最大总和等于三个堆栈的总和

假设我们有三堆正数。我们必须找到允许移除的顶部元素的可能相等的最大堆叠总和。堆栈表示为数组。数组的第一个索引表示堆栈的顶部元素。假设堆栈元素像[3,10],[4,5]和[2,1]。输出将为0。只有从所有堆栈中删除所有元素之后,总和才能相等。

为了解决这个问题,我们将遵循这个想法。想法是比较每个堆栈的总和,如果它们不相等,则删除堆栈中具有最大总和的顶部元素。我们将遵循以下步骤-

  • 在单个堆栈中查找所有元素的总和。

  • 如果所有三个堆栈的总和相等,则这是最大和。

  • 否则,请删除三个堆栈中具有最大总和的堆栈顶部元素。然后重复步骤1和步骤2。

示例

#include <iostream>
#include <algorithm>
using namespace std;
int maxStackSum(int stk1[], int stk2[], int stk3[], int size1, int size2, int size3) {
   int add1 = 0, add2 = 0, add3 = 0;
   for (int i=0; i < size1; i++)
      add1 += stk1[i];
   for (int i=0; i < size2; i++)
      add2 += stk2[i];
   for (int i=0; i < size3; i++)
      add3 += stk3[i];
   int top1 =0, top2 = 0, top3 = 0;
   int ans = 0;
   while (true){
      if (top1 == size1 || top2 == size2 || top3 == size3)
         return 0;
      if (add1 == add2 && add2 == add3)
         return add1;
      if (add1 >= add2 && add1 >= add3)
         add1 -= stk1[top1++];
      else if (add2 >= add3 && add2 >= add3)
         add2 -= stk2[top2++];
      else if (add3 >= add2 && add3 >= add1)
         add3 -= stk3[top3++];
   }
}
int main() {
   int stack1[] = { 3, 2, 1, 1, 1 };
   int stack2[] = { 4, 3, 2 };
   int stack3[] = { 1, 1, 4, 1 };
   int size1 = sizeof(stack1)/sizeof(stack1[0]);
   int size2 = sizeof(stack2)/sizeof(stack2[0]);
   int size3 = sizeof(stack3)/sizeof(stack3[0]);
   cout << "The maximum sum is: " << maxStackSum(stack1, stack2, stack3, size1, size2, size3);
}

输出结果

The maximum sum is: 5