蓝桥杯 找零钱 贪心

问题描述
  有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
参考自https://blog.csdn.net/weixin_44650011/article/details/104529759?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[1000010];
 4 int main() {
 5     int n;
 6     cin >> n;
 7     for(int i = 0; i < n; i++) {
 8         cin >> a[i];
 9     }
10     int m_25 = 0, m_50 = 0, m_100 = 0; //分别用来存储阿姨手中不同面额纸币的数量
11     if (a[0] != 25) { //因为阿姨手里一开始没有零钱,所以如果第一个人给的不是25,直接gg
12         cout << "NO" << endl;
13     } else {
14         m_25++; //第一个人必是25,先拿一张25
15         bool flag = true; //bool值用来动态表示阿姨能否找回零钱
16         for (int i = 1; i < n; i++) { //考虑剩下排队的人 
17             // 阿姨收到钱首先会自动成为她的零钱
18             if (a[i] == 25) {
19                 m_25++;
20             } else if (a[i] == 50) {
21                 m_50++;
22             } else {
23                 m_100++;
24             }
25             //每一个人付给阿姨的钱减去25,剩下的值为阿姨需要找回的零钱,减去25为0表示不需要阿姨找零钱 
26             a[i] -= 25;
27             //本题的关键重点,如何贪心:优先把大面额的零钱找给同学 
28             //本题的关键重点,如何贪心:优先把大面额的零钱找给同学
29             //本题的关键重点,如何贪心:优先把大面额的零钱找给同学
30             while (a[i] >= 50 && m_50) { //如果待找零钱数大于等于50且阿姨有50的零钱 
31                 a[i] -= 50;
32                 m_50--;
33             }
34             while (a[i] > 0 && m_25) { //绝对不可以写a[i]>=0,当a[i]=0时,就不用找钱了 
35                 a[i] -= 25;
36                 m_25--;
37             }
38             if (a[i]) { //两个while找零钱之后,如果应找零钱额不为0,就gg 
39                 flag = false;
40                 break;
41             }
42         }
43         if (flag) {
44             cout << "YES" << endl;
45         } else {
46             cout << "NO" << endl;
47         }
48     }
49     return 0;
50 }
原文地址:https://www.cnblogs.com/fx1998/p/12600641.html