题意

给你 n n n a a a b b b,让你求出 0 0 0 n n n 中到 a a a 的距离是 b b b 的点。如果没有,输出 No solution

前言

你可能会看到,官方题解(yummy 的题解)使用了分支结构,从正着去分类讨论,求出那些点。

而学过循环结构的同学觉得这种做法太难了!为什么不倒着做呢?

所以,本篇题解只针对学过循环结构的同学,如果你并没有学,那还是去看官方题解吧。

思路

首先,我们肯定要输入!

cin>>n>>a>>b;

然后再来看主体思路:

前面提到了倒着做,那怎么个倒法呢?其实就是通过枚举每一个点,看它是否满足到达 a a a 的距离为 b b b。这个点在 b ≠ 0 b\not= 0 b=0 的时候有两个,如图所示:

这两个点到 a a a 的距离都是 b b b

所以我们只需要循环从 0 0 0 n n n 判断这个点是否等于 a + b a+b a+b 或者 a − b a-b ab,如果等于就输出。

同时,我们还需要记录有没有值(为了后面处理无解)。

有些同学可能要问了,这道题要求从小到大输出,这个可以做到吗?

因为这个地方是从小到大枚举,所以输出的顺序也一定是从小到大的。

这部分的代码:

for(int i=0;i<=n;i++){
	if(i==a-b||i==a+b){//学过绝对值的同学也可以写为 abs(a-i)==b
		cout<<i<<' ';
		is_ok=1;
	}
}

这道题就结束啦。

总结

本题使用了逆向思维,这种思考方式在整个信息学竞赛都很常用。同时,本题可以训练同学们的 C++ 基础语法和顺序结构,希望各位理解本题的做法。

Logo

集算法之大成!助力oier实现梦想!

更多推荐