執行給定操作後的最大可能數組和
在這個問題中,我們將對陣列元素執行給定的操作,並找到最後的最大和。
在這裡,每次操作中,我們可以從陣列中最多選擇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開關。預設情況下,新按鈕仍會透過長按啟動這兩個功能,但您也可以讓長按執行一系列其他功能,包括快速存取相機或手電筒、啟動語音備忘錄、對焦模式、翻譯和放大鏡等輔助功能。您還可以將其與單一快捷方式相關聯,從而開闢大量其他可能
