蓝桥杯——算法训练——找零钱
小贪心,更何况这道题的金额面值很特殊,只是将贪心策略带入了情境,只要做好数值的更新,即可把一切都交给for循环模拟。
——————————————————————————————————————
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
有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));
for(int i=0; i<n; i++) scanf("%d", &a[i]);
int m_25 = 0, m_50 = 0, m_100 = 0; // 分别用来存储阿姨手中不同面额纸币的数量
if(a[0] != 25) printf("NO\n"); // 这一点需要注意,由于阿姨手里一开始没有零钱,所以如果第一个人就给50,直接gg
else{
m_25++; // 先拿一张25再说
bool flag = true; // bool值用来动态表示阿姨能否找回零钱
for(int i=1 ;i<n; i++){
// 阿姨收到钱首先会自动成为她的零钱库
if(a[i] == 25) m_25++;
else if(a[i] == 50) m_50++;
else m_100++;
// 每一个人付的钱首先要减去25,余值才是阿姨需要找回的零钱额,这一点必须注意
a[i] -= 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] -= 25;
m_25--;
}
if(a[i]){ // 如果应找零钱额不为0
flag = false;
break;
}
}
if(flag) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}