📌  相关文章
📜  在将任何元素的符号更改恰好 M 次后最大化数组总和

📅  最后修改于: 2021-10-26 05:13:51             🧑  作者: Mango

给定一个大小为N的数组 arr[]和一个整数M,任务是在将数组中任何元素的符号更改恰好M后,找到该数组的最大和。允许多次更改同一元素的符号。

例子:

方法:解决这个问题的主要思想是在每次迭代中翻转数组的最小数。通过这样做,负值将变为正值,并且数组总和将最大化。

请按照以下步骤解决问题:

  • 初始化一个最小优先级队列,比如pq[],并推送数组arr[] 的所有元素。
  • 初始化一个变量,比如sum = 0,以存储数组的最大和。
  • 迭代 while 循环直到 M 大于0并执行以下操作:
    • 从优先级队列中弹出并从变量sum 中减去它。
    • 将弹出元素的符号乘以-1并将其添加到sum 中
    • 将新的翻转元素推入优先级队列,并从M 中减去 1
  • 最后,打印存储在变量sum 中的最大和。

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
  
// Function to find the maximum sum
// with M flips
void findMaximumSumWithMflips(
    int arr[], int N, int M)
{
  
    // Declare a priority queue
    // i.e. min heap
    priority_queue, greater > pq;
  
    // Declare the sum as zero
    int sum = 0;
  
    // Push all elements of the
    // array in it
    for (int i = 0; i < N; i++) {
        pq.push(arr[i]);
        sum += arr[i];
    }
  
    // Iterate for M times
    while (M--) {
  
        // Get the top element
        sum -= pq.top();
  
        // Flip the sign of the
        // top element
        int temp = -1 * pq.top();
  
        // Remove the top element
        pq.pop();
  
        // Update the sum
        sum += temp;
  
        // Push the temp into
        // the queue
        pq.push(temp);
    }
  
    cout << sum;
}
  
// Driver program
int main()
{
  
    int arr[] = { -3, 7, -1, -5, -3 };
  
    // Size of the array
    int N = sizeof(arr) / sizeof(arr[0]);
    int M = 4;
  
    findMaximumSumWithMflips(arr, N, M);
  
    return 0;
}


输出:
19
输出
19

时间复杂度: O(NLogN)
辅助空间: O(N)

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程。