1 条题解

  • 0
    @ 2026-6-19 10:31:06

    📝 题目大意

    在两栋 100 层建筑 A 和 B 之间,同层有走廊(A的第 ii 层 ↔ B的第 ii 层),还有交错走廊(A的第 i+1i+1 层 ↔ B的第 ii 层),通过任意走廊花费 xx 分钟。同一栋建筑内相邻楼层有楼梯,花费 yy 分钟。求从 A 的第 aa 层到 B 的第 bb 层的最短时间。

    💡 解题思路

    1. 题目分析:这是一个在特殊分层图上的最短路径问题,但数据范围很小(a,b,x,y100a,b,x,y \leq 100),且图结构高度规则,可以推导出 O(1)O(1) 的公式解。关键在于利用走廊和楼梯的组合,找到最优路径。

    2. 算法推导

      • 关键观察:用走廊替代楼梯。考虑在同一栋建筑内从第 ii 层移动到第 i+1i+1 层:直接走楼梯花费 yy;但也可以走 A 的第 ii 层 → B 的第 ii 层(走廊,xx),再走 B 的第 ii 层 → A 的第 i+1i+1 层(交错走廊,xx),总花费 2x2x。因此,楼梯的实际有效代价不会超过 2x2x,即 y=min(y,2x)y = \min(y, 2x)。这一步优化保证了后续公式的正确性。

      • 分情况讨论

        • a>ba > b(起点在终点上方):最优策略是立即利用交错走廊向下跨越一层。从 A 的第 aa 层走交错走廊直接到 B 的第 a1a-1 层(花费 xx),然后在 B 楼内向下走 ab1a-b-1 层楼梯到达 B 的第 bb 层(花费 y×(ab1)y \times (a-b-1))。总时间:x+y×(ab1)x + y \times (a-b-1)

        • a=ba = b(同一层):直接走同层走廊即可,花费 xx

        • a<ba < b(起点在终点下方):先走同层走廊从 A 到 B(花费 xx),然后在 B 楼内向上走 bab-a 层楼梯到达第 bb 层(花费 y×(ba)y \times (b-a))。总时间:x+y×(ba)x + y \times (b-a)

      • 为什么这是最优的?y2xy \leq 2x 的前提下,任何迂回路径(如反复横跳于两楼之间)都可以被简化为上述直连路径而不会更优。交错走廊本质上提供了"对角线移动",在 a>ba > b 时可以比"先同层再走楼梯"少走一层楼梯。

    3. 边界与细节

      • 由于 yy 被限制为 min(y,2x)\min(y, 2x),代码中直接修改了 y 的值,后续计算无需再判断。
      • a=b+1a = b + 1 时,ab1=0a-b-1 = 0,公式退化为 xx,即直接走交错走廊一步到达,无需走楼梯。与样例 1 一致。
      • 所有数据范围较小(100\leq 100),无需考虑 int 溢出。

    ⏱️ 复杂度分析

    • 时间复杂度:仅做常数次比较和算术运算, O(1)O(1)
    • 空间复杂度:仅使用几个整型变量, O(1)O(1)

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