AT916 题解
2022/8/25 6:24:09
本文主要是介绍AT916 题解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
题目传送门
小学生又双叒叕来写题解啦!
大家使用的都是 while 循环,那我来一个 for 循环版本!
我的思路是贪心。
怎么个贪心法呢?
由于最多只能执行一百次,那我们就得多用三。
准确的说,就是按三二一的顺序,一个不行就轮到下一个。
为什么可以这样也很简单。
比方说你减了三,如果你不减三,还是可以通过减一再减二达到,但次数增加了。
而且,用减一再减二的方法,可能还会命中陷阱。
因此,遵循:能用三就用三,不能就用二,还不能就用一,仍然不行就爆掉。
一百次后还不行,也爆掉。
对了,得特判一下开始就中陷阱的情况,也爆掉。
送上满分代码:
#include <iostream> #include <cstdio> using namespace std; int n, g1, g2, g3; void Error() { printf("NO\n"); exit(0); } void OK() { printf("YES\n"); exit(0); } bool chk(int x) //判断是否可以执行一次步骤,即判断 n-x 是否可行。 { int t = n - x; if (t < 0) return false; //如果减后变负数了,当然爆掉。 if (t == g1 || t == g2 || t == g3) return false; return true; } int main() { //注意输出时勿忘祖传换行。 scanf("%d%d%d%d", &n, &g1, &g2, &g3); if (!chk(0)) Error(); //特判原数为零。 for (int i = 1; i <= 100; i++) { if (chk(3)) n -= 3; else if (chk(2)) n -= 2; else if (chk(1)) n -= 1; else Error(); //如果都减不了,爆掉。 if (n == 0) OK(); } Error(); //一百次后还是没到零,爆掉。 }
首发:2022-02-06 17:39:55
这篇关于AT916 题解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南