Benelux Algorithm Programming Contest 2019 E. Efficient Exchange(dp)

You have recently acquired a new job at the Bank for Acquiring Peculiar Currencies. Here people can make payments, and deposit or withdraw money in all kinds of strange currencies. At your first day on the job you help a customer from Nijmegia, a small insignificant country famous for its enormous coins with values equal to powers of 10, that is, 1, 10, 100, 1000, etc. This customer wants to make a rather large payment, and you are not looking forward to the prospect of carrying all those coins to and from the vault.

image_看图王.png

You therefore decide to think things over first. You have an enormous supply of Nijmegian coins in reserve, as does the customer (most citizens from Nijmegia are extremely strong). You now want to minimize the total number of coins that are exchanged, in either direction, to make the exact payment the customer has to make.

For example, if the customer wants to pay 83 coins there are many ways to make the exchange. Here are three possibilities:

  • Option 1. The customer pays 8 coins of value 10, and 3 coins of value 1. This requires exchanging 8 + 3 = 11 coins.

  • Option 2. The customer pays a coin of value 100, and you return a coin of value 10, and 7 coins of value 1. This requires exchanging 1 + 1 + 7 = 9 coins.

  • Option 3. The customer pays a coin of value 100, and 3 coins of value 1. You return 2 coins of value 10. This requires exchanging 1 + 3 + 2 = 6 coins.

It turns out the last way of doing it requires the least coins possible.

input

A single integer image.png the amount the customer from Nijmegia has to pay.

output

Output the minimum number of coins that have to be exchanged to make the required payment.

样例输入1复制

83

样例输出1复制

6

样例输入2复制

13

样例输出2复制

4

样例输入3复制

12345678987654321

样例输出3复制

42

我太菜了我按 > 5,= 5,<5 分的类WA了一下午……千算万算没有算到这是个dp 还是太菜了

 

题意:

有面值为10的幂大小的硬币,给定价格,问最少用到的硬币数量

思路:

每一位上的数字有两种情况:直接给 或 在前一位多给1

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e3 + 10;

int dp[N][N];

int main()
{
    string s;
    while(getline(cin, s))
    {
        int len = s.size();
        dp[0][0] = 0;
        dp[0][1] = 1;
        for(int i = 0; i < len; ++i)
        {
            dp[i + 1][0] = min(dp[i][0] + s[i] - '0', dp[i][1] + 10 -s[i] + '0');
            dp[i + 1][1] = min(dp[i][0] + s[i] - '0' + 1, dp[i][1] + 9 - s[i] + '0');
        }
        cout<<dp[len][0]<<'\n';;
    }
    return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值