C++ 中获取恰好 k 次更改后最大数组和
给定一个包含正整数和负整数的数组以及一个数字 K。任务是在对数组元素进行恰好 K 次更改后找到数组的最大和。这里的单次更改操作将单个元素乘以 -1。
使用的方法是将每个负数转换为正数。如果存在 N 个负数,则为此我们将对数组进行排序:
如果 N<K,则在 N 次操作后每个元素都将为正,并且我们剩下 K-N 次操作
现在,如果 K-N 为偶数,则对于剩余的 K-N 次操作,更改符号将没有影响,不做任何操作。
如果 K-N 为奇数,则对于剩余的 K-N 次操作,更改最小数字的符号(这将变为负数),但总和将最大。
或者
如果 N>K,则更改 K 个负数的符号并添加数组。总和将最大。
输入
Arr[]= { 0,-2,6,4,8,2,-3 } K=4
输出
Maximum array sum is : 25
说明 - 元素的 4 次更改为
1. 0,2,6,4,8,2,-3 -2 changed to 2 2. 0,2,6,4,8,2,3 -3 changed to 3 3. 0,-2,6,4,8,2,3 2 changed to -2 4. 0,2,6,4,8,2,3 -2 changed to 2 Maximum sum is 25
输入
Arr[]= { -1,-2,-3,-4,-5,-6,-7 } K=4
输出
Maximum array sum is : 16
说明 - 元素的 4 次更改为
1. -1,-2,-3,-4,-5,-6,7 -7 changed to 7 2. -1,-2,-3,-4,-5,6,7 -6 changed to 6 3. -1,-2,-3,-4,5,6,7 -5 changed to 5 4. -1,-2,-3,4,5,6,7 -4 changed to 4 Maximum sum is 16
下面程序中使用的方法如下
整数数组 Arr[] 用于存储整数。
整数“size”存储数组的长度,并初始化 K。
函数 returnSum( int arr[], int n, int k) 以数组、其大小和 k 作为输入,并在恰好进行 k 次操作后返回其元素的最大和。
首先,我们将使用 sort(arr,arr+n) 对数组进行排序
现在,我们将对所有负元素应用操作 arr[i]*-1,直到到达最后一个索引或 k 变为 0。
如果 k 小于负元素的数量,则上述步骤将更改 k 个负元素。
如果 k 较大,则将检查 k 的剩余值是奇数还是偶数。
如果剩余的 k 为奇数,则我们将通过应用操作 arr[i]*-1 一次来更改最小元素的值,其中 arr[i] 至少被找到。(奇数次乘以 -1 等同于进行一次)
如果剩余的 k 为偶数,则 arr[i]*-1 将没有影响。不做任何操作。
计算整个数组的和并返回结果。
示例
#include <bits/stdc++.h> using namespace std; int returnSum(int arr[], int n, int k){ // Sort the array elements sort(arr, arr + n); // Change signs of the negative elements // starting from the smallest //this loop will change the sign of -ve elements //for each k one -ve element is turned positive for(i=0;i<n;i++) if(k>0 && arr[i]<0){ arr[i]=arr[i]*-1; k--; } //if k is non zero and odd change sign of minimum element //once as it is same as changing its sign odd times if (k % 2 == 1) { int min = arr[0]; int pos=0; //index of minimum element for (i = 1; i < n; i++) if (arr[i]<min){ min = arr[i]; pos=i; } arr[pos] *= -1; } int sum = 0; for (int i = 0; i < n; i++) sum += arr[i]; return sum; } int main(){ int Arr[] = { -3, 4, -3, 6, 8 }; int size =5; int K = 4; cout <<"Maximum array sum that can be obtained after exactly k changes" returnSum(Arr, size, K) << endl; return 0; }
输出
Maximum array sum that can be obtained after exactly k changes : 24
广告