目錄
範例範例
方法一
演算法
範例
輸出
方法二
首頁 後端開發 C++ 執行給定操作後的最大可能數組和

執行給定操作後的最大可能數組和

Aug 28, 2023 pm 01:17 PM
操作 最大 數組和

執行給定操作後的最大可能數組和

在這個問題中,我們將對陣列元素執行給定的操作,並找到最後的最大和。

在這裡,每次操作中,我們可以從陣列中最多選擇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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PyCharm使用教學:詳細指引你執行操作 PyCharm使用教學:詳細指引你執行操作 Feb 26, 2024 pm 05:51 PM

PyCharm是一款非常受歡迎的Python整合開發環境(IDE),它提供了豐富的功能和工具,使得Python開發變得更有效率和便利。本文將為大家介紹PyCharm的基本操作方法,並提供具體的程式碼範例,幫助讀者快速入門並熟練操作工具。 1.下載安裝PyCharm首先,我們需要前往PyCharm官網(https://www.jetbrains.com/pyc

什麼是 sudo,為什麼它如此重要? 什麼是 sudo,為什麼它如此重要? Feb 21, 2024 pm 07:01 PM

sudo(超級使用者執行)是Linux和Unix系統中的關鍵指令,允許一般使用者以root權限執行特定指令。 sudo的功能主要體現在以下幾個方面:提供權限控制:sudo透過授權使用者以臨時方式取得超級使用者權限,從而實現了對系統資源和敏感操作的嚴格控制。普通用戶只能在需要時透過sudo獲得臨時的特權,而不需要一直以超級用戶登入。提升安全性:透過使用sudo,可以避免在常規操作中使用root帳號。使用root帳戶進行所有操作可能會導致意外的系統損壞,因為任何錯誤或不小心的操作都將具有完全的權限。而

Linux Deploy的操作步驟及注意事項 Linux Deploy的操作步驟及注意事項 Mar 14, 2024 pm 03:03 PM

LinuxDeploy的操作步驟及注意事項LinuxDeploy是一款強大的工具,可協助使用者在Android裝置上快速部署各種Linux發行版,讓使用者在行動裝置上體驗完整的Linux系統。本文將詳細介紹LinuxDeploy的操作步驟以及注意事項,同時提供具體的程式碼範例,幫助讀者更好地使用此工具。操作步驟:安裝LinuxDeploy:首先在

win10開機密碼忘記按F2怎麼操作 win10開機密碼忘記按F2怎麼操作 Feb 28, 2024 am 08:31 AM

想必很多的用戶家裡都有那麼幾台不用的電腦,因為長時間不用完全忘了開機密碼,於是想知道一下,忘記密碼要怎麼操作呢?那就一起來看看吧。 win10開機密碼忘記按F2怎麼操作1、按下電腦的電源鍵,然後開機時按下F2(不同電腦品牌進入bios的按鍵也不同)。 2.在bios介面中,找到security選項(不同品牌電腦的位置可能有所不同)。一般都在頂部的設定選單中。 3.然後找到SupervisorPassword選項並且點選。 4.這時候用戶就可以看到自己的密碼了,同時找到旁邊的Enabled切換為Dis

華為Mate60 Pro截圖操作步驟分享 華為Mate60 Pro截圖操作步驟分享 Mar 23, 2024 am 11:15 AM

隨著智慧型手機的普及,螢幕截圖功能成為日常使用手機的必備技能之一。華為Mate60Pro作為華為公司的旗艦手機之一,其截圖功能自然也備受用戶關注。今天,我們就來分享華為Mate60Pro手機的截圖操作步驟,讓大家能夠更方便地進行截圖操作。首先,華為Mate60Pro手機提供了多種截圖方式,可以依照個人習慣選擇適合自己的方式來操作。以下詳細介紹幾種常用的截

如何在 iPhone 15 Pro 和 15 Pro Max 上停用操作按鈕 如何在 iPhone 15 Pro 和 15 Pro Max 上停用操作按鈕 Nov 07, 2023 am 11:17 AM

Apple在iPhone15Pro和15ProMax中帶來了一些Pro獨有的硬體功能,吸引了所有人的注意。我們正在談論鈦合金框架、時尚的設計、全新的A17Pro晶片組、令人興奮的5倍長焦鏡頭等等。在iPhone15Pro機型添加的所有花里胡哨的功能中,操作按鈕仍然是一個突出和突出的功能。毋庸置疑,它是在iPhone上啟動操作的有用補充。也就是說,您可能會不小心按住“操作”按鈕並無意中觸發功能。坦白說,這很煩人。要避免這種情況,您應該停用iPhone15Pro和15ProMax上的操作按鈕。讓

CSS網頁滾動監聽:監聽網頁滾動事件並執行對應的操作 CSS網頁滾動監聽:監聽網頁滾動事件並執行對應的操作 Nov 18, 2023 am 10:35 AM

CSS網頁滾動監聽:監聽網頁滾動事件並執行對應的操作隨著前端技術的不斷發展,網頁的效果和互動也越來越豐富多樣。其中,滾動監聽是一種常見的技術,可以實現在使用者滾動網頁時,根據滾動位置執行一些特效或操作。一般來說,滾動監聽可以透過JavaScript來實現。但是,在某些情況下,我們也可以透過純CSS來實現滾動監聽的效果。本文將介紹如何透過CSS來實現網頁的滾動

自訂操作按鈕:探索iPhone 15 Pro的個人化設置 自訂操作按鈕:探索iPhone 15 Pro的個人化設置 Sep 24, 2023 pm 03:05 PM

蘋果的iPhone15Pro和iPhone15ProMax引入了一個新的可編程動作按鈕,取代了音量按鈕上方的傳統響鈴/靜音開關。繼續閱讀以了解「操作」按鈕的功能,以及如何自訂。蘋果iPhone15Pro型號上全新的動作按鈕取代了啟動Ring和Silent的傳統iPhone開關。預設情況下,新按鈕仍會透過長按啟動這兩個功能,但您也可以讓長按執行一系列其他功能,包括快速存取相機或手電筒、啟動語音備忘錄、對焦模式、翻譯和放大鏡等輔助功能。您還可以將其與單一快捷方式相關聯,從而開闢大量其他可能

See all articles