1 条题解

  • 0
    @ 2025-11-19 17:59:37

    问题本质

    aa 走到 bb,每次走 1122 步,不能经过 cc 的倍数,求最短路。

    核心思路

    关键观察

    • 问题等价于在数轴上从 aabb 的最短路,避开 cc 的倍数
    • 如果没有禁止点,最短路 = ba2\lceil \frac{b-a}{2} \rceil(尽量用 +2+2

    算法步骤

    1. 检查直接路径

    计算不使用绕路的最少步数:

    • 尽量多用 YY 信号(+2+2
    • 剩余部分用 XX 信号(+1+1

    2. 检测危险点

    检查区间 [a,b][a, b] 内是否存在 cc 的倍数:

    • 如果不存在,直接输出 ba2\lceil \frac{b-a}{2} \rceil
    • 如果存在,需要绕路

    3. 绕路策略

    对于每个危险点 kck \cdot c

    • 方案1:提前避开(在 kc1k \cdot c - 1 处用 +1+1 代替 +2+2
    • 方案2:延迟避开(在 kc2k \cdot c - 2 处用 +2+2 代替 +1+1
    • 选择增加步数最少的方案

    特殊情况

    • c=2c = 2:只能走奇数路径,需要特殊处理
    • 多个危险点:每个危险点可能增加 11 步绕路代价

    复杂度

    • 时间复杂度:O(1)O(1)(数学计算)
    • 空间复杂度:O(1)O(1)

    实现公式

    def min_signals(a, b, c):
        base_steps = (b - a + 1) // 2  # 尽量用+2
        if (b - a) % 2 == 1:
            base_steps += 1
        
        # 检查是否需要绕路
        first_danger = ((a // c) + 1) * c
        if first_danger < b:
            # 需要绕路,增加1步
            base_steps += 1
        
        return base_steps
    
    • 1

    信息

    ID
    5511
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者