首頁 >後端開發 >C++ >C++程式:計算讓所有禮物數量相等的運算次數

C++程式:計算讓所有禮物數量相等的運算次數

PHPz
PHPz轉載
2023-09-12 11:13:021368瀏覽

C++程式:計算讓所有禮物數量相等的運算次數

假設我們有兩個陣列 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中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除