1 条题解
-
0
📝 题目大意
在两栋 100 层建筑 A 和 B 之间,同层有走廊(A的第 层 ↔ B的第 层),还有交错走廊(A的第 层 ↔ B的第 层),通过任意走廊花费 分钟。同一栋建筑内相邻楼层有楼梯,花费 分钟。求从 A 的第 层到 B 的第 层的最短时间。
💡 解题思路
-
题目分析:这是一个在特殊分层图上的最短路径问题,但数据范围很小(),且图结构高度规则,可以推导出 的公式解。关键在于利用走廊和楼梯的组合,找到最优路径。
-
算法推导:
-
关键观察:用走廊替代楼梯。考虑在同一栋建筑内从第 层移动到第 层:直接走楼梯花费 ;但也可以走 A 的第 层 → B 的第 层(走廊,),再走 B 的第 层 → A 的第 层(交错走廊,),总花费 。因此,楼梯的实际有效代价不会超过 ,即 。这一步优化保证了后续公式的正确性。
-
分情况讨论:
-
(起点在终点上方):最优策略是立即利用交错走廊向下跨越一层。从 A 的第 层走交错走廊直接到 B 的第 层(花费 ),然后在 B 楼内向下走 层楼梯到达 B 的第 层(花费 )。总时间:。
-
(同一层):直接走同层走廊即可,花费 。
-
(起点在终点下方):先走同层走廊从 A 到 B(花费 ),然后在 B 楼内向上走 层楼梯到达第 层(花费 )。总时间:。
-
-
为什么这是最优的? 在 的前提下,任何迂回路径(如反复横跳于两楼之间)都可以被简化为上述直连路径而不会更优。交错走廊本质上提供了"对角线移动",在 时可以比"先同层再走楼梯"少走一层楼梯。
-
-
边界与细节:
- 由于 被限制为 ,代码中直接修改了
y的值,后续计算无需再判断。 - 当 时,,公式退化为 ,即直接走交错走廊一步到达,无需走楼梯。与样例 1 一致。
- 所有数据范围较小(),无需考虑
int溢出。
- 由于 被限制为 ,代码中直接修改了
⏱️ 复杂度分析
- 时间复杂度:仅做常数次比较和算术运算, 。
- 空间复杂度:仅使用几个整型变量, 。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; int main(){ int a,b,x,y; cin>>a>>b>>x>>y; int ans=0; // 关键优化:楼梯代价不会超过两次走廊代价(可以通过 A→B→A 绕行替代) if(y>2*x) y=2*x; if(a>b) ans=x+y*(a-b-1); // 起点在上方:走交错走廊直接下到 B 的 a-1 层,再走楼梯 else if(a==b) ans=x; // 同层:直接走同层走廊 else ans=x+y*(b-a); // 起点在下方:走同层走廊到 B,再向上走楼梯 cout<<ans<<endl; return 0; } -
- 1
信息
- ID
- 858
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者