[语言月赛 202410] 刻度尺 的题解
记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。
在解题之前提交题解的代码会导致封禁。
作者:
概述
本题要求找出刻度尺 上所有与刻度
距离恰好为
的刻度,按从小到大输出,不存在时输出
No solution。核心解法是列出满足 的两个候选刻度
与
,再检查它们是否落在
范围内。
分析
核心观察
与刻度 距离为
的刻度只有两个候选:
和
,只需判断它们是否在
区间内;当
时两者重合,只输出一个。
思路
由距离的定义,刻度 满足条件当且仅当:
即 或
。候选值还需满足
。由于
,恒有
,按此顺序收集即可保证从小到大输出。
具体示例
以样例 为例:
、
、
,候选为
和
,均落在
内,输出
、
。样例
中候选
与
均越界,因此输出
No solution。
算法步骤
- 读入
n、a、b。 - 计算候选刻度
x1为、
x2为。
- 若
x1在内,将其加入答案。
- 若
x2与x1不同且x2在内,将其加入答案。
- 答案非空则从小到大输出;否则输出 No solution。
复杂度分析
时间:
空间:
实现注意事项
- 当
时,
与
相等,需要去重,只输出一个
。
- 越界判断使用闭区间:刻度
与
都是合法刻度。
- 输出要求整数间以单个空格分隔,行末无多余空格;无解时严格输出字符串 No solution。
源代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, a, b;
cin >> n >> a >> b;
vector<int> ans;
int x1 = a - b, x2 = a + b;
if (x1 >= 0 && x1 <= n) ans.push_back(x1);
if (x2 != x1 && x2 >= 0 && x2 <= n) ans.push_back(x2);
if (ans.empty()) {
cout << "No solution\n";
} else {
for (int i = 0; i < (int)ans.size(); i++) {
if (i) cout << ' ';
cout << ans[i];
}
cout << '\n';
}
return 0;
}
n, a, b = map(int, input().split())
ans = []
for x in (a - b, a + b):
if 0 <= x <= n and x not in ans:
ans.append(x)
if not ans:
print("No solution")
else:
print(*ans)
评论