蓝桥杯——算法训练——找零钱
有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] -=