BAPC 2019 E. Efficient Exchange 思維+ 貪心

題目鏈接: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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章