📌  相关文章
📜  执行给定操作后的最大可能数组总和

📅  最后修改于: 2021-09-03 04:02:12             🧑  作者: Mango

给定正整数数组arr[] 、整数Q以及大小为Q 的数组X[]Y[] 。对于数组X[]Y[] 中的每个元素,我们可以执行以下操作:

  • 对于来自数组 X[] 和 Y[] 的每个查询,从数组arr[]中最多选择 X[i] 个元素,并用整数Y[i]替换所有选定的元素。
  • 执行 Q 操作后,任务是从数组arr[] 中获取最大和。

例子:

天真的方法:天真的想法是从数组arr[] 中挑选X[i] 个数字元素。如果数组中的元素小于Y[i],则更新这些元素的X[i]

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

高效的方法:这个想法是使用优先级队列在具有较低值的元素之前获取具有较高值的元素,精确地成对的优先级队列以其频率来存储值。以下是步骤:

  • 将数组arr[] 的每个元素及其出现在优先级队列中。
  • 对于数组X[]中的每个元素(比如X[i] )执行以下操作:
    1. 从优先级队列中最多选择X[i]个最小元素。
    2. 如果选择元素小于Y[i],则将其替换为 Y[i]。
    3. 将被替换的元素以其对应的频率重新插入优先级队列。
  • 在上述操作之后,数组arr[]将包含所有元素之和为最大的元素。打印总和。

下面是上述方法的实现:

C++
// C++ implementation to find the
// maximum possible sum of array
// after performing given operations
#include 
using namespace std;
  
// Function to get maximum
// sum after q operations
void max_sum(int ar[], int n,
             int q, int x[], int y[])
{
    int ans = 0, i;
  
    // priority queue to
    // get maximum sum
    priority_queue > 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 code
int 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 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 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 };
      
    max_sum(ar, n, q, x, y); 
}
}
  
// This code is contributed by offbeat


输出:
800

时间复杂度: O(N*log 2 N)
辅助空间: O(N)

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live