Atcoder E - Payment(DP)

题意:
在一个国家有有 1 0 100 + 1 10^{100}+1 种货币,分别是价值为 1 , 1 0 1 , 1 0 2 , 1 0 3 . . . . . . . 1 0 100 1,10^1,10^2,10^3.......10^{100} 的货币,现在你在超市买东西,你需要支付 N N 元,问你和货员在这个过程中用到的总票数最小是多少张。
思路:

从低位到高位,每一位只有两种选择,
1、支付 x x 1 0 i 10^i
2、支付1张 1 0 i + 1 10^{i+1} ,找给 10 x 10-x 1 0 i 10^i 的货币。
我们设 d p [ i ] [ 0 ] dp[i][0] 表示用第一种方法的最小票数, d p [ i ] [ 1 ] dp[i][1] 表示取第二种方法的最小票数。

char s[N];
ll dp[N][2];
int main(){
    s[0] = '0';
    cin >> (s + 1);
    int l = strlen(s  + 1);
    dp[l][0] = s[l] - '0';
    dp[l][1] = 10 - (s[l] - '0');
    for(int i = l - 1;i >= 0;i --){
        dp[i][0] = min(dp[i+1][0] + s[i] - '0',dp[i+1][1] + s[i]-'0' + 1);
        dp[i][1] = min(dp[i+1][0] + 10 - (s[i]-'0'),dp[i+1][1] + (10 - (s[i]-'0'+1)));
    }
    cout <<min(dp[0][0],dp[0][1]);
}
发布了589 篇原创文章 · 获赞 31 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_43408238/article/details/104456472