前言
这题我在CSDN上和牛客上看到好多写错了的但是AC了的……所以特意来写一篇解法。
先放上链接:(没写的可以去写一下)牛客竞赛语法入门班循环结构习题_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)
我的方法
#include<iostream>
using namespace std;
int n, money, a = 0, b = 0;
int main() {
cin >> n;
for (int i = 0;i < n;i++) {
cin >> money;
if (money == 25)a++;
else if (money == 50) {
b++;
a--;
if (a < 0) {
printf("NO");
return 0;
}
}
else if(a>0&&b>0){
a--;
b--;
}
else {
a -= 3;
if (a < 0) {
printf("NO");
return 0;
}
}
}
printf("YES");
return 0;
}
思路:
变量a和b分别存放25元和50元的数量,每次输入一个人交的钱后判断要怎么零钱。如果一个人交了50元,那么我只能给他25元,这时25元数量减一;如果一个人交100元,我有两种方式(很多解答忽略了这一点但是过了,咱也不知道咋回事)找零钱,一种是找一张50和一张25,另一种是找三张25,但凡有一种可行这次就能找零成功。途中如果25元数量小于零则整个找零过程失败。(这里为什么没有判断50是否小于0呢?你再看看,我是在b>0也就是存在50的情况下才把50交出去,所以50不可能小于零)
最后
当然这个写法避开了很多写法会犯的错误,但是我的方法也可能存在错误,欢迎指出。
不过至少我能想到的例子下,这种方法都是可行的。