蓝桥杯——算法训练——找零钱

蓝桥杯——算法训练——找零钱

小贪心,更何况这道题的金额面值很特殊,只是将贪心策略带入了情境,只要做好数值的更新,即可把一切都交给for循环模拟。
——————————————————————————————————————
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
有n个人正在饭堂排队买海北鸡饭。每份海北鸡饭要25元。奇怪的是,每个人手里只有一张钞票(每张钞票的面值为25、50、100元),而且饭堂阿姨一开始没有任何零钱。请问饭堂阿姨能否给所有人找零(假设饭堂阿姨足够聪明)
输入格式
第一行一个整数n,表示排队的人数。
接下来n个整数a[1],a[2],…,a[n]。a[i]表示第i位学生手里钞票的价值(i越小,在队伍里越靠前)
输出格式
输出YES或者NO
样例输入_0
4
25 25 50 50
样例输出_0
YES
样例输入_1
2
25 100
样例输出_1
NO
样例输入_2
4
25 25 50 100
样例输出_2
YES
数据规模和约定
n不超过1000000
———————————————————————————————————————
思路分析:这道题的关键就是在模拟时贪一把(从大面额开始),基本思路主要在代码注释里,这里强调注意输出形式,一定要区分大小写。

#include <iostream>
#include <string>
#include <string.h>
#include <stdio.h>
using namespace std;
int a[1000005];
int main(){
	int n;
	while(scanf("%d", &n) != EOF){
		memset(a, 0, sizeof(a));
		for(int i=0; i<n; i++) scanf("%d", &a[i]);
		int m_25 = 0, m_50 = 0, m_100 = 0; // 分别用来存储阿姨手中不同面额纸币的数量
		if(a[0] != 25) printf("NO\n"); // 这一点需要注意,由于阿姨手里一开始没有零钱,所以如果第一个人就给50,直接gg
		else{
			m_25++; // 先拿一张25再说
			bool flag = true; // bool值用来动态表示阿姨能否找回零钱
			for(int i=1 ;i<n; i++){
				// 阿姨收到钱首先会自动成为她的零钱库
				if(a[i] == 25) m_25++;
				else if(a[i] == 50) m_50++;
				else m_100++;
				// 每一个人付的钱首先要减去25,余值才是阿姨需要找回的零钱额,这一点必须注意
				a[i] -= 25;
				// 三个while循环的顺序就是贪心策略的体现
				while(a[i] > 100 && m_100){
					a[i] -= 100;
					m_100--;
				}
				while(a[i] > 50 && m_50){
					a[i] -= 50;
					m_50--;
				}
				while(a[i] > 0 && m_25){
					a[i] -= 25;
					m_25--;
				}
				if(a[i]){ // 如果应找零钱额不为0
					flag = false;
					break;
				}
			}
			if(flag) printf("YES\n");
			else printf("NO\n");
		}
	}
	return 0;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值