1 条题解
-
0
📝 题目大意
在一条全长 100 km 的马拉松赛道上,每 5 km 设置一个补给站(0, 5, 10, ..., 100 km,共 21 个)。给定高桥君当前所在位置 N km,求距离他最近的补给站位置。数据保证最近补给站唯一。
💡 解题思路
-
题目分析:补给站位置是 5 的倍数,N 是 0~100 的整数。问题本质上是将 N 四舍五入到最近的 5 的倍数。由于 5 是奇数,对于整数 N 来说,不可能出现恰好到两个补给站距离相等的情况,因此最近补给站一定是唯一的。
-
算法推导:
- 令
r = N % 5,表示 N 距离前一个 5 的倍数(即N - r)的偏移量。 - 前一个补给站位于
N - rkm,后一个补给站位于N + (5 - r)km。 - 距离比较:到前一个站的距离为
r,到后一个站的距离为5 - r。 - 当
r < 3(即 r = 0, 1, 2)时,前一个站更近或刚好在站上,答案为N - r。 - 当
r ≥ 3(即 r = 3, 4)时,后一个站更近,答案为N + (5 - r)。 - 这等价于将 N 除以 5 后四舍五入再乘以 5。
- 令
-
边界与细节:
- N = 0 或 N = 100 时,
r = 0,r < 3成立,答案为 0 或 100,与补给站在起点/终点一致。 - N 恰好等于某个补给站(如 N = 55),
r = 0,答案为 N 本身,正确。 - 由于 N 是整数且 5 是奇数,
5 - r不可能等于r(即不会出现r = 2.5这种平局),无需特殊处理。
- N = 0 或 N = 100 时,
⏱️ 复杂度分析
- 时间复杂度:,仅涉及一次取模和一次条件判断。
- 空间复杂度:,仅使用常数个变量。
💻 标准代码 (C++)
#include <iostream> using namespace std; int main() { int N; cin >> N; int r = N % 5; // 计算 N 除以 5 的余数,即 N 距离前一个 5 的倍数的偏移量 if (r < 3) { // 余数小于 3:前一个补给站更近(或刚好在补给站上) cout << N - r << endl; // 向下取整到 5 的倍数 } else { // 余数 ≥ 3:后一个补给站更近 cout << N + (5 - r) << endl; // 向上取整到 5 的倍数 } return 0; } -
- 1
信息
- ID
- 716
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者