问题描述
有n个人正在饭堂排队买海北鸡饭。每份海北鸡饭要25元。奇怪的是,每个人手里只有一张钞票(每张钞票的面值为25、50、100元),而且饭堂阿姨一开始没有任何零钱。请问饭堂阿姨能否给所有人找零(假设饭堂阿姨足够聪明)
输入格式
第一行一个整数n,表示排队的人数。
接下来n个整数a[1],a[2],...,a[n]。a[i]表示第i位学生手里钞票的价值(i越小,在队伍里越靠前)
接下来n个整数a[1],a[2],...,a[n]。a[i]表示第i位学生手里钞票的价值(i越小,在队伍里越靠前)
输出格式
输出YES或者NO
样例输入
4
25 25 50 50
25 25 50 50
样例输出
YES
样例输入
2
25 100
25 100
样例输出
NO
样例输入
4
25 25 50 100
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 }