使用C ++中的给定操作最大化数组和

描述

(2 * n – 1)个整数数组。我们可以更改数组中恰好n个元素的符号。换句话说,我们可以精确选择n个数组元素,并将每个元素乘以-1。找到数组的最大和。

示例

如果输入数组为{-2,100,-3},那么我们可以获得-2和-3的最大变化符号。更改符号数组后变为-

{2,100,3},此数组的最大和为105。

算法

  • 计算负数

  • 通过取数字的绝对值来计算数组的总和。

  • 通过取数字的绝对值来找到数组的最小数

  • 检查是否。的负数是奇数,n的值是偶数,然后从和中减去m的两倍,这将是数组的最大和,否则,sum的值将是数组的最大和

  • 重复上述步骤(2 * n – 1)次

示例

现在让我们看一个例子-

#include <bits/stdc++.h>
using namespace std;
int getMaxSum(int *arr, int n) {
   int negtiveCnt = 0;
   int sum = 0;
   int m = INT_MAX;
   for (int i = 0; i < 2 * n - 1; ++i) {
      if (arr[i] < 0) {
         ++negtiveCnt;
      }
      sum = sum + abs(arr[i]);
      m = min(m, abs(arr[i]));
   }
   if (negtiveCnt % 2 && n % 2 == 0) {
      sum = sum - 2 * m;
      return sum;
   }
   return sum;
}
int main() {
   int arr[] = {-2, 100, -3};
   int n = 2;
   cout << "Maximum sum = " << getMaxSum(arr, n) << endl;
   return 0;
}

输出结果

Maximum sum = 105