1 条题解

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

    📝 题目大意

    高桥君从数轴原点 00 出发,想走到坐标 XX。坐标 YY 处有一堵墙,若墙挡在 00XX 之间则无法直接通过;但若先去坐标 ZZ 处拾取锤子,即可破墙而过。求能否到达终点,若能则输出最短移动距离,否则输出 1-1

    💡 解题思路

    1. 题目分析

      • 数据范围 X,Y,Z1000|X|,|Y|,|Z| \le 1000,可以 O(1)O(1) 分类讨论。
      • XXYYZZ 互不相同且均不为 00,无需考虑重合或从原点出发的退化情况。
      • 核心在于判断墙 YY 是否在 00XX 之间,以及锤子 ZZ 是否可达。
    2. 算法推导

      • 情况一:墙不在 00XX 之间(即 YYXX 在原点同侧,但 YYXX 更远,或 YYXX 在原点异侧)。此时高桥君可以直接走到终点,最小距离为 X|X|
      • 情况二:墙在 00XX 之间(即 0<Y<X0 < Y < XX<Y<0X < Y < 0)。此时需要锤子破墙:
        • 若墙也在 00ZZ 之间(即 0<Y<Z0 < Y < ZZ<Y<0Z < Y < 0),说明锤子和终点都在墙的另一侧,无法触及锤子,输出 1-1
        • 否则锤子可达:路径为 0Z0 \to Z(取锤子)再 ZXZ \to X(破墙到终点),距离为 Z+ZX|Z| + |Z - X|
    3. 边界与细节

      • XXZZ 在墙的同侧时,锤子可达。
      • XXZZ 在墙的异侧时,锤子不可达,返回 1-1
      • 注意 abs 中负数取绝对值即可,abs(-Z) 等价于 abs(Z),代码中写 abs(-Z)abs(Z-X) 保持对称。

    ⏱️ 复杂度分析

    • 时间复杂度O(1)O(1),仅进行常数次判断与算术运算。
    • 空间复杂度O(1)O(1),仅使用几个整数变量。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std ;
    int main(){
        int X, Y, Z;
        cin >> X >> Y >> Z;
        // 判断墙 Y 是否在 0 和 X 之间
        if ((0 < Y && Y < X) || (X < Y && Y < 0)) {
            // 墙挡在路上,需要锤子;判断墙 Y 是否也在 0 和 Z 之间
            if ((0 < Y && Y < Z) || (Z < Y && Y < 0)) {
                // 锤子和终点都在墙的另一侧,无法拿到锤子
                cout << -1;
            } else {
                // 锤子可达:先去 Z 取锤子,再破墙走到 X
                cout << abs(-Z) + abs(Z - X);
            }
        } else {
            // 墙不在 0 和 X 之间,直接走到终点
            cout << abs(-X);
        }
    }
    
    • 1

    信息

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