蓝桥杯VIP试题 算法训练 找零钱

试题 算法训练 找零钱

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

接下来n个整数a[1],a[2],…,a[n]。a[i]表示第i位学生手里钞票的价值(i越小,在队伍里越靠前)
输出格式
  输出YES或者NO
样例输入
4
25 25 50 50
样例输出
YES
样例输入
2
25 100
样例输出
NO
样例输入
4
25 25 50 100
样例输出
YES
数据规模和约定
  n不超过1000000

思路:这道题就是换零钱就行,而题目说钞票越小越靠前(是不是暗示我们已经排好序了,实际上并没有),而题目又说假设饭堂阿姨足够聪明,这不是摆明了说前面收到的钱并没有从小到大排好,如果刚开始就收到一张100,而没有零钱,题目就可以直接结束了,所以没这么简单,足够聪明的意思是所有的钱全部收好之后再来换算,如果能全部换算成功则说明可以,不能全部换算成功则说明不行。数字不算大,用int型就行,直接先记录25、50、100的各有多少张再进行换算,加如25的有1234张,50的有649张,100的有575张,先把50的全部换算完,剩下25的有585张,50的是自己的了,再用50的换100的,把100的全换成50的和25的,575张50加575张25即可(当然此题还有另外的方法,大家可以多尝试)。

代码如下:

#include<iostream>
using namespace std;
int main(){
	int n,i,j,q1=0,q2=0,q3=0;
	cin>>n;
	for(i=0;i<n;i++){
		cin>>j;
		if(j==25){
			q1++;
		}
		if(j==50){
			q2++;
		}
		if(j==100){
			q3++;
		}
	}
	q1=q1-q2;
	q3=q3*2-q2;
	if(q1>=q3){
		cout<<"YES";
	}
	else{
		cout<<"NO";
	}
}
发布了51 篇原创文章 · 获赞 47 · 访问量 1940

猜你喜欢

转载自blog.csdn.net/weixin_45269353/article/details/104583076