C++程式:求購買二進位制字串所需的最少硬幣數
假設我們有三個數字c0、c1和h,以及一個二進位制字串S。我們可以翻轉S中的任何位。每次更改需支付h枚硬幣。經過一些更改(可能為零)後,我們想要購買該字串。要購買該字串,我們必須購買其所有字元。購買位0需要支付c0枚硬幣,購買位1需要支付c1枚硬幣。我們必須找到購買該字串所需的最小硬幣數。
因此,如果輸入類似於c0 = 10;c1 = 100;h = 1;S = "01010",則輸出將為52,因為首先我們更改S中的第2位和第4位,為此支付2枚硬幣。現在字串將變為00000。之後,我們可以購買該字串,為此支付5⋅10=50枚硬幣。支付的硬幣總數將為2+50=52。
步驟
為了解決這個問題,我們將遵循以下步驟:
k := 0 n := size of S for initialize i := 0, when i < n, update (increase i by 1), do: if S[i] is same as '0', then: k := k + minimum of c0 and (c1 + h) Otherwise k := k + minimum of (c0 + h) and c1 return k
示例
讓我們看看下面的實現以更好地理解:
#include <bits/stdc++.h> using namespace std; int solve(int c0, int c1, int h, string S) { int k = 0; int n = S.size(); for (int i = 0; i < n; i++) { if (S[i] == '0') k = k + min(c0, c1 + h); else k = k + min(c0 + h, c1); } return k; } int main() { int c0 = 10; int c1 = 100; int h = 1; string S = "01010"; cout << solve(c0, c1, h, S) << endl; }
輸入
10, 100, 1, "01010"
輸出
52
廣告