
【洛谷入门赛】B4043 刻度尺 202410 场
你可能会看到,官方题解(yummy 的题解)使用了分支结构,从正着去分类讨论,求出那些点。而学过循环结构的同学觉得这种做法太难了!为什么不倒着做呢?所以,本篇题解只针对学过循环结构的同学,如果你并没有学,那还是去看官方题解吧。本题使用了逆向思维,这种思考方式在整个信息学竞赛都很常用。同时,本题可以训练同学们的 C++ 基础语法和顺序结构,希望各位理解本题的做法。
题意
给你
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 a−b,如果等于就输出。
同时,我们还需要记录有没有值(为了后面处理无解)。
有些同学可能要问了,这道题要求从小到大输出,这个可以做到吗?
因为这个地方是从小到大枚举,所以输出的顺序也一定是从小到大的。
这部分的代码:
for(int i=0;i<=n;i++){
if(i==a-b||i==a+b){//学过绝对值的同学也可以写为 abs(a-i)==b
cout<<i<<' ';
is_ok=1;
}
}
这道题就结束啦。
总结
本题使用了逆向思维,这种思考方式在整个信息学竞赛都很常用。同时,本题可以训练同学们的 C++ 基础语法和顺序结构,希望各位理解本题的做法。
更多推荐
所有评论(0)