1 条题解

  • 0
    @ 2026-6-19 10:30:35

    📝 题目大意

    在一条全长 100 km 的马拉松赛道上,每 5 km 设置一个补给站(0, 5, 10, ..., 100 km,共 21 个)。给定高桥君当前所在位置 N km,求距离他最近的补给站位置。数据保证最近补给站唯一。

    💡 解题思路

    1. 题目分析:补给站位置是 5 的倍数,N 是 0~100 的整数。问题本质上是将 N 四舍五入到最近的 5 的倍数。由于 5 是奇数,对于整数 N 来说,不可能出现恰好到两个补给站距离相等的情况,因此最近补给站一定是唯一的。

    2. 算法推导

      • r = N % 5,表示 N 距离前一个 5 的倍数(即 N - r)的偏移量。
      • 前一个补给站位于 N - r km,后一个补给站位于 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。
    3. 边界与细节

      • N = 0 或 N = 100 时,r = 0r < 3 成立,答案为 0 或 100,与补给站在起点/终点一致。
      • N 恰好等于某个补给站(如 N = 55),r = 0,答案为 N 本身,正确。
      • 由于 N 是整数且 5 是奇数,5 - r 不可能等于 r(即不会出现 r = 2.5 这种平局),无需特殊处理。

    ⏱️ 复杂度分析

    • 时间复杂度O(1)O(1),仅涉及一次取模和一次条件判断。
    • 空间复杂度O(1)O(1),仅使用常数个变量。

    💻 标准代码 (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
    上传者