备战蓝桥杯--贪心算法刷题整理1

找零钱(贪心算法)

题目描述:
有n个人正在饭堂排队买海北鸡饭。每份海北鸡饭要25元。奇怪的是,每个人手里只有一张钞票(每张钞票的面值为25、50、100元),而且饭堂阿姨一开始没有任何零钱。请问饭堂阿姨能否给所有人找零(假设饭堂阿姨足够聪明)
输入格式
  第一行一个整数n,表示排队的人数。

接下来n个整数a[1],a[2],…,a[n]。a[i]表示第i位学生手里钞票的价值(i越小,在队伍里越靠前)
输出格式
  输出YES或者NO

思路:
把25、50、100元的钞票数求出来,通过分析这几个数之间的关系进行判断即可


首先无论是否有100元的钞票(假设25、50、100元钞票数分别对应x,y,z),都应该保证x大于等于y,这样才能确保50元对应的钞票可以有零钱找回。另外,又可以分为两种情况:
一种是25元的特别多,50的少,这样多出来的一些25元可以用来给100元的找零钱,这样就必须满足x-y的数量要大于等于3倍的z(这里的3倍是因为,一张100元的找零钱,要用到3张25的),即x-y >= 3z
还有一种情况,就是50元的数量也比较富裕,可以25元和50元一起凑成75元,为100元找零钱。这样就必须满足x-y 再+ y 的数量要大于2倍的100元的数量(这里的2倍是因为,一张100的对应一张25和一张50),即x >= 2
z

这样求出对应的x,y,z,再通过条件判断就ok了

#include"iostream"
using namespace std;
int a[1000010];
int main(){
	int n;
	cin >> n;
	
	int x = 0,y = 0,z = 0;
	for(int i = 0;i < n;i ++){
		cin >> a[i];
		if(a[i] == 25){
			x ++;
		}else if(a[i] == 50){
			y ++;
		}else{
			z ++;
		}
	}
	
	
	if(x >= y && (x-y >= z*3 || x >= z*2)){
		cout << "YES";
	}else{
		cout << "NO";
	}
	return 0;
}

再分享一些小知识,#include“algorithm”文件头中一些常用的函数:


s.find(“x”) 查找字符串s中字符x对应的下标
s.count("x") 统计字符串s中字符x出现的次数
swap(a,b) 交换两个元素
fill(a,a+n,0) 对数组a[n]所有值赋值为0
sort(a,a+n,cmp) 排序默认从小到大
min(a,b) 返回a和b中的最小值
max(a,b) 返回a和b中的最大值
reverse(a,a+n) 数组反转

If you can take it,you can make it.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rabbit Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值