Efficient Exchange Benelux Algorithm Programming Contest 2019

Efficient Exchange

您最近在銀行獲得了一份新奇的貨幣工作。人們可以在這裏付款,並以各種奇怪的貨幣存入或提取錢。在工作的第一天,您會幫助來自奈梅賈的客戶,奈梅賈是一個微不足道的小國,以巨大的硬幣而聞名,其價值等於10的冪,即1、10、100、1000等。該客戶希望相當大的一筆付款,您不希望攜帶所有這些硬幣往返金庫。
因此,您決定先思考。您和客戶一樣都有大量的尼吉米亞硬幣儲備(大多數尼吉米亞公民都非常強大)。現在,您要儘量減少在任一方向上交換的硬幣總數,以準確支付客戶必須支付的費用。
例如,如果客戶要支付83個硬幣,則有很多方法可以進行兌換。這是三種可能性:
方法1: 客戶支付8個價值10的硬幣和3個價值1的硬幣。這需要交換8 + 3 = 11個硬幣。
方法2:客戶支付了一個價值100的硬幣,您返回了價值10的硬幣和7個價值1的硬幣。這需要交換1 +1 + 7 = 9個硬幣。
方法3:客戶支付一枚價值100的硬幣和3枚價值1的硬幣。您返回2枚價值10的硬幣。這需要交換1 + 3 + 2 = 6枚硬幣。
事實證明,這樣做的最後一種方法需要最少的硬幣。
輸入
0≤n<1010000,客戶必須支付的金額的一個整數。
輸出
輸出爲進行所需付款而必須兌換的最小硬幣數量。

樣例輸入1
83
樣例輸出1
6
樣例輸入2
13
樣例輸出2
4
樣例輸入3
12345678987654321
樣例輸出3
42

#include <bits/stdc++.h>
using namespace std;
int dp[10005][2];
int main()
{
	char s[10005];
	scanf("%s", s + 1);
	int len = strlen(s + 1);
	dp[0][0] = 0;
	dp[0][1] = 1;
	for (int i = 1; i <= len; i++)
	{
		dp[i][0] = min(dp[i - 1][0] + s[i] - '0', dp[i - 1][1] + 10 - s[i] + '0');
		dp[i][1] = min(dp[i - 1][0] + s[i] - '0' + 1, dp[i - 1][1] + 10 - s[i] + '0' - 1);
	}
	printf("%d\n", dp[len][0]);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章