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 题解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程