zoukankan      html  css  js  c++  java
  • 蓝桥杯 找零钱 贪心

    问题描述
      有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 }
  • 相关阅读:
    【PowerOJ1754&网络流24题】负载平衡问题(费用流)
    【PowerOJ1753&网络流24题】分配问题(KM)
    【PowerOJ1752&网络流24题】运输问题(费用流)
    【PowerOJ1751&网络流24题】数字梯形问题(费用流)
    【PowerOJ1746&网络流24题】航空路线问题(费用流)
    【PowerOJ1744&网络流24题】方格取数问题(最小割)
    【PowerOJ1742&网络流24题】试题库问题(最大流)
    【PowerOJ1741&网络流24题】最长递增子序列问题(最大流)
    【PowerOJ1739&网络流24题】魔术球问题(最大流)
    邮件系统相关协议之SMTP
  • 原文地址:https://www.cnblogs.com/fx1998/p/12600641.html
Copyright © 2011-2022 走看看