找零钱(贪心算法)
题目描述:
有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 >= 2z
这样求出对应的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.