执行给定操作后的最大可能数组和
在这个问题中,我们将对数组元素执行给定的操作,并找到最后的最大和。
在这里,每次操作中,我们可以从数组中最多选择X[p]个元素,并用Y[p]个元素替换它们,以最大化总和。
在简单的方法中,我们将找到X[p]数组元素,这些元素小于Y[p]元素,并将其替换为Y[p]。
在高效的方法中,我们将使用优先队列来获取最大的总和。
问题陈述− 我们给定了包含N个数字的nums[]数组。同时,我们给定了包含M个整数的X[]和Y[]数组。我们需要对nums[]数组执行以下操作。
我们需要对X[]和Y[]元素的每个元素执行M次操作。在每次操作中,我们需要从数组nums[]中选择最大的X[p]元素,并将其替换为Y[p]。
给定的任务是在执行M次操作后找到nums[]数组元素的最大和。
示例示例
输入
nums[] = {10, 8, 7, 60, 20, 18, 30, 60}; m = 3; x[] = {1, 2, 5}; y[] = {500, 10, 2};
输出
708
Explanation − 让我们逐个执行每个操作。
在第一次操作中,我们将用500替换7个元素。所以,数组变为 {10, 8, 500, 60, 20, 18, 30, 60}。
在第二次操作中,我们最多可以用10替换2个元素,但我们只有1个小于10的元素。所以,我们将8替换为10,数组变为{10, 10, 500, 60, 20, 18, 30, 60}。
在第三个操作中,我们最多可以用2替换5个元素,但数组中没有任何小于2的元素。因此,我们不会替换任何元素。
输入
nums[] = {30, 40, 50, 50, 60}; m = 3; x[] = {2, 3, 6}; y[] = {10, 8, 21};
输出
230
解释 − y[]数组的所有元素都小于原数组的元素。因此,我们不需要替换给定数组的任何元素来获得最大的和。
输入
nums[] = {30, 40, 50, 50, 60}; m = 3; x[] = {2, 4, 5}; y[] = {50, 60, 100};
输出
500
Explanation − 在这里,我们可以在每次操作中最多替换x[p]个元素。在最后一次操作中,我们可以将数组中的每个元素替换为100,从而得到最大和等于100。
方法一
在这种方法中,我们将遍历x[]和y[]数组。在每次迭代中,我们将对数组进行排序,以获取最多x[p]个小于y[p]元素的数组元素,并用y[p]替换它们。
算法
步骤 1 − 将‘maxSum’初始化为0,用于存储数组元素的最大和。
步骤2 − 开始遍历x[]和y[]数组元素。
步骤 3 − 将 x[p] 的值存入临时变量,并对 nums[] 数组进行排序。
第四步− 在循环内开始遍历已排序的数组。
步骤 5 − 如果温度大于0,并且 nums[q] 小于 y[p],则使用 y[p] 更新 nums[q],并将 temp 值减1。
第6步− 在循环之外,开始遍历更新后的数组,将所有数组元素的和取出并存储到maxSum变量中。
第7步 − 在函数结束时返回maxSum。
示例
#include <bits/stdc++.h> using namespace std; int getMaxSum(int nums[], int n, int q, int x[], int y[]) { int maxSum = 0; // Traverse X[] and Y[] array for (int p = 0; p < q; p++) { // Replacing x[p] number of elements of nums[] array with y[p] if they are lesser than y[p] int temp = x[p]; sort(nums, nums + n); for (int q = 0; q < n; q++) { if (temp > 0 && nums[q] < y[p]) { nums[q] = y[p]; temp--; } } } // Sum of the array for (int p = 0; p < n; p++) { maxSum += nums[p]; } return maxSum; } int main() { int nums[] = {10, 8, 7, 60, 20, 18, 30, 60}; int n = (sizeof nums) / (sizeof nums[0]); int m = 3; int x[] = {1, 2, 5}; int y[] = {500, 10, 2}; cout << "The maximum sum we can get by replacing the array values is " << getMaxSum(nums, n, m, x, y); return 0; }
输出
The maximum sum we can get by replacing the array values is 708
时间复杂度− O(M*NlogN),其中O(M)用于遍历所有查询,O(NlogN)用于对数组进行排序。
空间复杂度− 对于对数组进行排序,空间复杂度为O(N)。
方法二
在这种方法中,我们将使用优先队列来存储数组元素和其出现次数的配对。
例如,我们将为每个数组元素将{nums[p],1}对推入优先队列。同时,我们将{y[p],x[p]}对推入优先队列。在优先队列中,对将根据第一个元素进行排序。因此,我们可以从队列中取出最高的N个元素。在这里,对于{y[p],x[p]}对,我们可以取出y[p]元素x[p]次,并且我们需要取出总共N个元素以最大化总和。
算法
Step 1 − Initialize the ‘maxSum’ with 0 and the priority queue to store the pair of elements and their number of occurrences.
第二步− 对于所有的数组元素,将{nums[p], 1}对插入队列中。
步骤 3 − 然后,将 {y[p], x[p]} 对插入优先队列中。
第四步− 迭代直到 n 大于 0。
步骤 4.1 − 从优先队列中取出第一个元素。
步骤 4.2 − 将 first_ele * max(n, second_ele) 添加到总和中。这里,我们使用 max(n, second_ele) 来处理最后一种情况。
步骤 4.3 − 从 n 中减去 second_ele。
第5步− 返回maxSum。
示例
#include <bits/stdc++.h> using namespace std; int getMaxSum(int nums[], int n, int m, int x[], int y[]) { int maxSum = 0, p; // To get maximum sum priority_queue<pair<int, int>> p_que; // Insert nums[] array pairs into the queue for (p = 0; p < n; p++) p_que.push({nums[p], 1}); // Push replacement pairs for (p = 0; p < m; p++) p_que.push({y[p], x[p]}); // Add the first N elements of the priority queue in the sum while (n > 0) { // Get top element of priority queue auto temp = p_que.top(); // Remove top element p_que.pop(); // Add value to the sum maxSum += temp.first * min(n, temp.second); // Change N n -= temp.second; } return maxSum; } int main() { int nums[] = {10, 8, 7, 60, 20, 18, 30, 60}; int n = (sizeof nums) / (sizeof nums[0]); int m = 3; int x[] = {1, 2, 5}; int y[] = {500, 10, 2}; cout << "The maximum sum we can get by replacing the array values is " << getMaxSum(nums, n, m, x, y); return 0; }
输出
The maximum sum we can get by replacing the array values is 708
时间复杂度 - O(N*logN + m*logm),其中O(N)和O(m)用于遍历给定的数组,O(logN)用于插入和删除队列中的元素。
空间复杂度 - O(N+M),用于将对存储到队列中。
在第一种方法中,我们需要在每次迭代中对数组进行排序,以找到最小的x[p]个元素。使用优先队列在插入或删除元素时自动对元素进行排序,因为它使用了堆数据结构。因此,它可以提高代码的性能。
以上是执行给定操作后的最大可能数组和的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

PyCharm是一款非常流行的Python集成开发环境(IDE),它提供了丰富的功能和工具,使得Python开发变得更加高效和便捷。本文将为大家介绍PyCharm的基本操作方法,并提供具体的代码示例,帮助读者快速入门并熟练操作该工具。1.下载和安装PyCharm首先,我们需要前往PyCharm官网(https://www.jetbrains.com/pyc

sudo(超级用户执行)是Linux和Unix系统中的一个关键命令,允许普通用户以root权限运行特定命令。sudo的功能主要体现在以下几个方面:提供权限控制:sudo通过授权用户以临时方式获取超级用户权限,从而实现了对系统资源和敏感操作的严格控制。普通用户只能在需要时通过sudo获得临时的特权,而不需要一直以超级用户身份登录。提升安全性:通过使用sudo,可以避免在常规操作中使用root账户。使用root账户进行所有操作可能会导致意外的系统损坏,因为任何错误或不小心的操作都将具有完全的权限。而

LinuxDeploy的操作步骤及注意事项LinuxDeploy是一款强大的工具,可以帮助用户在Android设备上快速部署各种Linux发行版,让用户能够在移动设备上体验到完整的Linux系统。本文将详细介绍LinuxDeploy的操作步骤以及注意事项,同时提供具体的代码示例,帮助读者更好地使用这一工具。操作步骤:安装LinuxDeploy:首先在

想必很多的用户家里都有那么几台不用的电脑,因为长时间不用完全忘记了开机密码,于是想要知道一下,忘记密码要怎么操作呢?那就一起来看看吧。win10开机密码忘记按F2怎么操作1、按下电脑的电源键,然后开机时按下F2(不同电脑品牌进入bios的按键也不同)。2、在bios界面中,找到security选项(不同品牌电脑的位置可能有所不同)。一般都在顶部的设置菜单中。3、然后找到SupervisorPassword选项并且点击。4、这时候用户就可以看到自己的密码了,同时找到旁边的Enabled切换为Dis

随着智能手机的普及,截屏功能成为日常使用手机的必备技能之一。华为Mate60Pro作为华为公司的旗舰手机之一,其截屏功能自然也备受用户关注。今天,我们就来分享华为Mate60Pro手机的截屏操作步骤,让大家能够更加便捷地进行截屏操作。首先,华为Mate60Pro手机提供了多种截屏方式,可以根据个人习惯选择适合自己的方式进行操作。下面详细介绍几种常用的截

Apple在iPhone15Pro和15ProMax中带来了一些Pro独有的硬件功能,吸引了所有人的注意力。我们正在谈论钛合金框架、时尚的设计、全新的A17Pro芯片组、令人兴奋的5倍长焦镜头等等。在iPhone15Pro机型添加的所有花里胡哨的功能中,操作按钮仍然是一个突出和突出的功能。毋庸置疑,它是在iPhone上启动操作的有用补充。也就是说,您可能会不小心按住“操作”按钮并无意中触发功能。坦率地说,这很烦人。要避免这种情况,您应该禁用iPhone15Pro和15ProMax上的操作按钮。让

CSS网页滚动监听:监听网页滚动事件并执行相应的操作随着前端技术的不断发展,网页的效果和交互也越来越丰富多样。其中,滚动监听是一种常见的技术,可以实现在用户滚动网页时,根据滚动位置执行一些特效或者操作。一般来说,滚动监听可以通过JavaScript来实现。但是,在某些情况下,我们也可以通过纯CSS来实现滚动监听的效果。本文将介绍如何通过CSS来实现网页的滚动

苹果的iPhone15Pro和iPhone15ProMax引入了一个新的可编程动作按钮,取代了音量按钮上方的传统响铃/静音开关。继续阅读以了解“操作”按钮的功能,以及如何对其进行自定义。苹果iPhone15Pro型号上全新的动作按钮取代了激活Ring和Silent的传统iPhone开关。默认情况下,新按钮仍会通过长按激活这两个功能,但您也可以让长按执行一系列其他功能,包括快速访问相机或手电筒、激活语音备忘录、对焦模式、翻译和放大镜等辅助功能。您还可以将其与单个快捷方式相关联,从而开辟大量其他可能
