AtCoder Beginner Contest 155 E - Payment

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;
}

发布了78 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Fiveneves/article/details/104367834