E - Payment
题目链接-E - Payment
题目大意
在AtCoder王国里有面值为10x(0≤x≤100)的纸币,你去超市买一个价值为n的物品,为了付款,你会选择至少为n的一些钱,并把它交给职员。然后,办事员会把零钱还给你,问你和职员所使用的纸币的最小数目是多少
解题思路
类似于高精度进位,分情况讨论即可
- 用数组a[N]记录你需要给的每种面额纸币的数目
- 当你使用第i种面额的纸币数目大于10时,可以用第i+1种面额的纸币替代
- 当你使用第i种面额的纸币数目大于5时,可以给一张第i+1种面额的纸币,让售货员找零给你10-a[i];
- 当你使用第i种面额的纸币数目等于5时,就需要判断i+1种是不是比5大
- 记得int数组稍微开大一点,防止溢出
附上代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
const int M=1e9+7;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
typedef long long ll;
typedef pair<int,int> PII;
char s[N];
int a[N+10];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>s;
ll ans=0;
int len=strlen(s);
for(int i=0;i<len;i++)
a[i]=s[len-i-1]-'0';
for(int i=0;i<len+15;i++){
if(a[i]>=10){
a[i]-=10;
a[i+1]++;
}
if(a[i]>=6){
ans+=(10-a[i]);//加上售货员找给我的数目
a[i+1]++;
}
else if(a[i]==5){
ans+=5;
if(a[i+1]>=5)
a[i+1]++;
}
else
ans+=a[i];//加上我自己需要使用的数目
}
cout<<ans<<endl;
return 0;
}