假設我們有兩個陣列 A 和 B,每個陣列的大小為 n。有n份禮物,我們想把它們送給一些孩子。第 i 份禮物有 A[i] 顆糖果和 B[i] 個橘子。在一次移動過程中,我們可以選擇一些禮物並執行以下操作之一-
從該禮物中取出一顆糖果(如果有); p>
#從這份禮物中取出一顆橘子(如果有的話);
從這份禮物中取出一顆糖果和一顆橘子禮物(如果有的話)。
所有禮物都應該是平等的。這意味著經過一系列的移動之後,以下兩個 應滿足條件:A[0] = A[1] = ... = A[n-1] 和 B[0] = B[1] = ... = B[n-1]。我們必須 找出使所有給定的禮物相等所需的最少步數。
上述問題可以透過應用貪心問題解決技術來解決。 貪婪演算法技術是當前最佳解決方案是的演算法類型 選擇而不是嘗試所有可能的解決方案。貪心演算法技術也 用於解決最佳化問題,就像它的大哥動態規劃一樣。動態中 編程時,需要遍歷所有可能的子問題,找出最優的 解決方案,但它有一個缺點;這需要更多的時間和空間。所以,在各種 場景貪婪技術用於找出問題的最佳解決方案。雖然確實如此 並不是在所有情況下都能給出最佳解決方案,如果精心設計,它可以比以下更快地產生解決方案 動態規劃問題。貪心技術提供了局部最優解 優化問題。這種技術的例子包括 Kruskal 和 Prim 的最小 生成樹(MST)演算法、霍夫曼樹編碼、Dijkstra 的單源最短路徑 問題等
https://www.tutorialspoint.com/data_structurals_algorithms/greedy_algorithms.htm
https://www.tutorialspoint.com/data_structurals_algorithms/dynamic_programming.htm p>
所以,如果我們問題的輸入是這樣的A = [3, 5, 6]; B = [3, 2, 3],則輸出為6, 因為最初是從 B 中取出,所以現在 B[0] 變成 [2, 2, 3],然後從 A[1] 中取出,所以 A = [3, 4, 6],然後再次從 A[1] 中取出,因此 A = [3, 3, 6],然後從 A[2] 和 B[2] 中取出,因此它們 變成 [3, 3, 5] 和 [2, 2, 2],然後從 A[2] 變成 A = [3, 3, 4],再從 A[2] 變成 使其成為 [3, 3, 3]。所以現在 A 有相同數量的糖果,B 有相同數量的橘子。
為了解決這個問題,我們將遵循以下步驟-
minA := inf minB := inf kq := 0 n := size of A for initialize i := 0, when i < n, update (increase i by 1), do: minA := minimum of minA and A[i] for initialize i := 0, when i < n, update (increase i by 1), do: minB := minimum of minB and B[i] for initialize i := 0, when i < n, update (increase i by 1), do: kq := kq + maximum of (A[i] - minA) and (B[i] - minB) return kq
讓我們看看以下實現,以便更好地理解-
#include <bits/stdc++.h> using namespace std; int solve(vector<int> A, vector<int> B){ int minA = 999, minB = 999, kq = 0; int n = A.size(); for (int i = 0; i < n; i++) minA = min(minA, A[i]); for (int i = 0; i < n; i++) minB = min(minB, B[i]); for (int i = 0; i < n; i++) kq += max(A[i] - minA, B[i] - minB); return kq; } int main(){ vector<int> A = { 3, 5, 6 }; vector<int> B = { 3, 2, 3 }; cout << solve(A, B) << endl; }
{ 3, 5, 6 }, { 3, 2, 3 }
6
以上是C++程式:計算讓所有禮物數量相等的運算次數的詳細內容。更多資訊請關注PHP中文網其他相關文章!