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
标签:g3,g2,g1,int,题解,d%,爆掉,AT916 来源: https://www.cnblogs.com/liangbowen/p/16622806.html