Maximum possible Array sum after performing given operations

Given array arr[] of positive integers, an integer Q, and arrays X[] and Y[] of size Q. For each element in arrays X[] and Y[], we can perform the below operations:
- For each query from array X[] and Y[], select at most X[i] elements from array arr[] and replace all the selected elements with integer Y[i].
- After performing Q operations, the task is to obtain maximum sum from the array arr[].
Examples:
Input: arr[] = {5, 2, 6, 3, 8, 5, 4, 7, 9, 10}, Q = 3, X[] = {2, 4, 1}, Y[] = {4, 3, 10}Â
Output: 68Â
Explanation:Â
For i = 1,Â
We can replace atmost 2 elements from array arr[] with integer 4. Here 2 element of array arr[] are smaller than 4 so we will replace elements 2 and 3 from array arr[] with 4 and arr[] becomes {5, 4, 6, 4, 8, 5, 4, 7, 9, 10}.
For i = 2,Â
We can replace at most 4 elements from array ar[] with integer 3, but no element of array arr[] is smaller than 3. So we will not replace anything.
For i = 3,Â
We can replace at most 1 element from array arr[] with integer 10, 9 elements of array arr[] are smaller than 10. To get the maximum sum, we will replace the smallest element from array arr[] with 10. Array arr[] after 3rd operation = {5, 10, 6, 4, 8, 5, 10, 7, 9, 10 }. The maximum possible sum is 68.
Input: ar[] = {200, 100, 200, 300}, Q = 2, X[] = {2, 3}, Y[] = {100, 90}Â
Output: 800Â
Explanation:Â
For i = 1,Â
We can replace atmost 2 elements from array arr[] with integer 100, no element of array arr[] is smaller than 100. So we will replace 0 elements.
For i = 2,Â
We can replace at most 3 elements from array arr[] with integer 90, no element of array arr[] is smaller than 90. So we will replace 0 elements. So the maximum sum we can obtain after q operation is 800.
Naive Approach: The naive idea is to pick X[i] number elements from the array arr[]. If the elements in the array are less than Y[i] then update X[i] of such elements.Â
Time Complexity: (N2), as we will be using nested loops for traversing N*N times. Where N is the number of elements in the array.
Auxiliary Space: O(1), as we will not be using any extra space.
Efficient Approach: The idea is to use a priority queue to get the element with higher value before the element with lower value, precisely priority queue of pairs to store value with its frequency. Below are the steps:
- Insert each element of the array arr[] with their occurrence in the priority queue.
- For each element(say X[i]) in the array X[] do the following:Â
- Choose at most X[i] number of minimum element from the priority queue.
- Replace it with Y[i] if choose element is less than Y[i].
- Insert back the replaced element into the priority queue with their corresponding frequency.
- After the above operations the array arr[] will have elements such that sum of all element is maximum. Print the sum.
Below is the implementation of the above approach:
C++
// C++ implementation to find the// maximum possible sum of array// after performing given operations#include <bits/stdc++.h>using namespace std;Â
// Function to get maximum// sum after q operationsvoid max_sum(int ar[], int n,             int q, int x[], int y[]){    int ans = 0, i;Â
    // priority queue to    // get maximum sum    priority_queue<pair<int, int> > pq;Â
    // Push pair, value and 1    // in the priority queue    for (i = 0; i < n; i++)        pq.push({ ar[i], 1 });Â
    // Push pair, value (to be replaced)    // and number of elements (to be replaced)    for (i = 0; i < q; i++)        pq.push({ y[i], x[i] });Â
    // Add top n elements from    // the priority queue    // to get max sum    while (n > 0) {Â
        // pr is the pair        // pr.first is the value and        // pr.second is the occurrence        auto pr = pq.top();Â
        // pop from the priority queue        pq.pop();Â
        // Add value to answer        ans += pr.first * min(n, pr.second);Â
        // Update n        n -= pr.second;    }Â
    cout << ans << "\n";}Â
// Driver codeint main(){Â Â Â Â int ar[] = { 200, 100, 200, 300 };Â Â Â Â int n = (sizeof ar) / (sizeof ar[0]);Â Â Â Â int q = 2;Â Â Â Â int x[] = { 2, 3 };Â Â Â Â int y[] = { 100, 90 };Â Â Â Â max_sum(ar, n, q, x, y);Â
    return 0;} |
Java
// Java implementation to find the // maximum possible sum of array // after performing given operations import java.util.*;import java.lang.*;Â
class GFG{Â
static class pair{Â Â Â Â int first, second;Â Â Â Â pair(int first, int second)Â Â Â Â {Â Â Â Â Â Â Â Â this.first = first;Â Â Â Â Â Â Â Â this.second = second;Â Â Â Â }}Â
// Function to get maximum // sum after q operations static void max_sum(int ar[], int n, int q,                    int x[], int y[]) {     int ans = 0, i; Â
    // priority queue to     // get maximum sum     PriorityQueue<pair> pq = new PriorityQueue<>(        (a, b) -> Integer.compare(a.second, b.second)); Â
    // Push pair, value and 1     // in the priority queue     for(i = 0; i < n; i++)         pq.add(new pair(ar[i], 1 )); Â
    // Push pair, value (to be replaced)     // and number of elements (to be replaced)     for(i = 0; i < q; i++)         pq.add(new pair(y[i], x[i])); Â
    // Add top n elements from     // the priority queue     // to get max sum     while (n > 0)    {                  // pr is the pair         // pr.first is the value and         // pr.second is the occurrence         pair pr = pq.peek(); Â
        // pop from the priority queue         pq.poll(); Â
        // Add value to answer         ans += pr.first * Math.min(n, pr.second); Â
        // Update n         n -= pr.second;     }     System.out.println(ans); } Â
// Driver Codepublic static void main (String[] args){Â Â Â Â int ar[] = { 200, 100, 200, 300 }; Â Â Â Â int n = ar.length; Â Â Â Â int q = 2; Â Â Â Â int x[] = { 2, 3 }; Â Â Â Â int y[] = { 100, 90 };Â Â Â Â Â Â Â Â Â max_sum(ar, n, q, x, y); }}Â
// This code is contributed by offbeat |
Python3
# Python implementation to find the# maximum possible sum of array# after performing given operationsÂ
from queue import PriorityQueueÂ
Â
def max_sum(arr, n, q, x, y):    ans = 0    i = 0    # priority queue to    # get maximum sum    pq = PriorityQueue()    # Push pair, value and 1    # in the priority queue    for i in range(n):        pq.put((-arr[i], 1))Â
    # Push pair, value (to be replaced)    # and number of elements (to be replaced)    for i in range(q):        pq.put((-y[i], x[i]))Â
    # Add top n elements from    # the priority queue    # to get max sumÂ
    while n > 0:        # pr is the pair        # pr.first is the value and        # pr.second is the occurrence        pr = pq.get()        # Add value to answer        ans += abs(pr[0]) * min(n, pr[1])        # Update n        n -= pr[1]    print(ans)Â
Â
ar = [200, 100, 200, 300]n = len(ar)q = 2x = [2, 3]y = [100, 90]max_sum(ar, n, q, x, y)Â
# This code is provided by sdeadityasharma |
C#
// C# implementation to find the// maximum possible sum of array// after performing given operationsusing System;using System.Linq;using System.Collections.Generic;Â
public class Pair {Â Â public int first;Â Â public int second;Â Â public Pair(int first, int second)Â Â {Â Â Â Â this.first = first;Â Â Â Â this.second = second;Â Â }}Â
public class GFG {Â
  // Function to get maximum  // sum after q operations  static void MaxSum(int[] ar, int n, int q, int[] x,                     int[] y)  {    int ans = 0;    int i, j;Â
    // Push pair, value and 1    // in the array    List<Pair> pq = new List<Pair>();    for (i = 0; i < n; i++)      pq.Add(new Pair(ar[i], 1));Â
    // Push pair, value (to be replaced)    // and number of elements (to be replaced)    for (i = 0; i < q; i++)      pq.Add(new Pair(y[i], x[i]));Â
    pq = pq.OrderBy(p => p.second).ToList();Â
    // Add top n elements from    // the priority queue    // to get max sum    while (n > 0) {Â
      // pr is the pair      // pr.first is the value and      // pr.second is the occurrence      var pr = pq[0];Â
      // pop from the priority queue      pq.RemoveAt(0);Â
      // Add value to answer      ans += pr.first * Math.Min(n, pr.second);Â
      // Update n      n -= pr.second;    }    Console.WriteLine(ans);  }Â
  // Driver Code  public static void Main(string[] args)  {    int[] ar = { 200, 100, 200, 300 };    int n = ar.Length;    int q = 2;    int[] x = { 2, 3 };    int[] y = { 100, 90 };Â
    MaxSum(ar, n, q, x, y);  }}Â
// This code is contributed by phasing17 |
Javascript
// Javascript implementation to find the// maximum possible sum of array// after performing given operationsÂ
// Function to get maximum// sum after q operations    function max_sum(arr, n, q, x, y) {    let ans = 0;          // priority queue to    // get maximum sum    let pq = [];            // Push pair, value and 1    // in the priority queue    for (let i = 0; i < n; i++) {        pq.push([-arr[i], 1]);    }         // Push pair, value (to be replaced)    // and number of elements (to be replaced)    for (let i = 0; i < q; i++) {        pq.push([-y[i], x[i]]);    }    pq.sort((a, b) => a[0] - b[0]);         // Add top n elements from    // the priority queue    // to get max sum    while (n > 0)    {             // pr is the pair        // pr.first is the value and        // pr.second is the occurrence        let pr = pq.shift();                 // Add value to answer        ans += Math.abs(pr[0]) * Math.min(n, pr[1]);                 // Update n        n -= pr[1];    }           console.log(ans);    }         // Driver code    let ar = [200, 100, 200, 300];    let n = ar.length;    let q = 2;    let x = [2, 3];    let y = [100, 90];         max_sum(ar, n, q, x, y);         // This code is contributed by Aman Kumar. |
800
Time Complexity: O(N*log2N), as we are using a loop to traverse N times and priority queue operation will take log2N times. Where N is the number of elements in the array.
Auxiliary Space: O(N), as we are using extra space for the priority queue. Where N is the number of elements in the array.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!



