1 条题解
-
0
📝 题目大意
高桥君从数轴原点 出发,想走到坐标 。坐标 处有一堵墙,若墙挡在 与 之间则无法直接通过;但若先去坐标 处拾取锤子,即可破墙而过。求能否到达终点,若能则输出最短移动距离,否则输出 。
💡 解题思路
-
题目分析:
- 数据范围 ,可以 分类讨论。
- 、、 互不相同且均不为 ,无需考虑重合或从原点出发的退化情况。
- 核心在于判断墙 是否在 和 之间,以及锤子 是否可达。
-
算法推导:
- 情况一:墙不在 与 之间(即 与 在原点同侧,但 比 更远,或 与 在原点异侧)。此时高桥君可以直接走到终点,最小距离为 。
- 情况二:墙在 与 之间(即 或 )。此时需要锤子破墙:
- 若墙也在 与 之间(即 或 ),说明锤子和终点都在墙的另一侧,无法触及锤子,输出 。
- 否则锤子可达:路径为 (取锤子)再 (破墙到终点),距离为 。
-
边界与细节:
- 当 和 在墙的同侧时,锤子可达。
- 当 和 在墙的异侧时,锤子不可达,返回 。
- 注意
abs中负数取绝对值即可,abs(-Z)等价于abs(Z),代码中写abs(-Z)与abs(Z-X)保持对称。
⏱️ 复杂度分析
- 时间复杂度:,仅进行常数次判断与算术运算。
- 空间复杂度:,仅使用几个整数变量。
💻 标准代码 (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
- 上传者