題目鏈接:https://nanti.jisuanke.com/t/44331
題意:你有無限的1,10,100……金錢,現在你要花費n元,你的代價是花費的金幣數和找零的金幣數之和,求最小代價
思路:對於小於5的位肯定是直接付比較優,大於5的話肯定是付10這種更優,等於5的時候需要特判一下如果
進位對前面的位是否更優,更優的話(a[i - 1] >= 5) 就進位就行了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define fi first
#define se second
#define ls rt << 1
#define rs rt << 1|1
#define lson l, mid, ls
#define rson mid + 1, r, rs
#define pll pair<ll, ll>
#define pii pair<int, int>
#define ull unsigned long long
#define pdd pair<double, double>
const int mod = 998244353;
const int maxn = 3e4 + 10;
const int inf = 0x3f3f3f3f;
char s[maxn];
int a[maxn];
int main()
{
scanf("%s", s + 1);
int n = strlen(s + 1);
for(int i = 1; i <= n; ++i) a[i] = s[i] - '0';
int pre = 0, sum = 0;
for(int i = n; i >= 1; --i)
{
a[i] += pre;
pre = 0;
if(a[i] > 5)
{
pre = 1;
sum += 10 - a[i];
}
else if(a[i] == 5)
{
if(a[i - 1] >= 5)
pre = 1;
sum += 5;
}
else sum += a[i];
}
sum += a[0] + pre;
printf("%d\n", sum);
return 0;
}