找零钱问题——贪心算法

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

有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));//把a个内存单元为a的设置初始值为0
		for(int i=0; i<n; i++) 
		scanf("%d", &a[i]);//输入一个数,代表同学给阿姨的钱
		int m_25 = 0, m_50 = 0, m_100 = 0; // 分别用来存储阿姨手中不同面额纸币的数量,一开始的时候,阿姨手中的25 元,50元,100元的钞票都为0
		if(a[0] != 25)//如果其中一个同学一开始给的不是25,那么阿姨此时没得找,返回no
	    printf("NO\n"); // 这一点需要注意,由于阿姨手里一开始没有零钱,所以如果第一个人就给50,直接gg
		else{
   
			m_25++; // 先拿一张25再说,25不需要找零
			bool flag = true; // bool值用来动态表示阿姨能否找回零钱,素衣阿姨可以支付,就是找回零钱
			for(int i=1 ;i<n; i++){
   
				// 阿姨收到钱首先会自动成为她的零钱库
				if(a[i] == 25) m_25++;//支付宝到账25元
				else if(a[i] == 50) m_50++;//支付宝到账50元
				else m_100++;//支付宝到账100元
				// 每一个人付的钱首先要减去25,余值才是阿姨需要找回的零钱额,这一点必须注意
				a[i] -= 25;//这个操作是上面三个情况都需要执行的操作,减去大盘鸡本身的价格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] -= 
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值