试题 算法训练 找零钱
资源限制
时间限制: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
样例二:
2
25 100
样例三:
4
25 25 50 100
样例输出
样例一:
YES
样例二:
NO
样例三:
YES
数据规模与约定
n不超过1000000
代码
#include<stdio.h>
int main(){
int n,i,x=0;
scanf("%d",&n);
int a[n],b[2]={0,0};//b[0]代表阿姨的25元纸币的数量,b[1]代表阿姨的50元纸币的数量
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n;i++){
if(a[i]==25){//25元不用找零钱
b[0]++;
}
else if(a[i]==50){//50元需要找25元
if(i==0||b[0]==0){//如果①第一个学生就是50元②没有25纸币,那么无法找零钱
printf("NO");
x=1;//标记无法找零钱
break;//直接跳出循环
}
else{//若可以找零钱
b[1]++;//则多一张50
b[0]--;//少一张25
}
}
else{//100元至少要找零钱75,
if(i==0||(b[0]<3&&b[1]==0)||b[0]==0){//①第一个学生是100②没有50且少于3张25③没有25
printf("NO");
x=1;//标记无法找零
break;//直接跳出循环
}
else{//可以找零钱
if(b[1]==0){//没有50
b[0]-=3;//则少3张25
}
else{//有50,因为25在学生是50时也可以找零钱所以在有50情况先用50找零钱,可以尽量避免出现无法找零钱
b[0]--;//少一张50
b[1]--;//少一张25
}
}
}
}
if(x==0){
printf("YES");
}
return 0;
}