1 条题解

  • 0
    @ 2025-10-27 17:06:34

    题目分析

    本题要求用最少的区间加 11 操作,将初始全 00 的序列变为目标高度序列 h1,h2,,hnh_1, h_2, \dots, h_n


    问题抽象

    给定初始全零数组 A=[0,0,,0]A = [0, 0, \dots, 0],要通过最少的“区间 +1+1”操作,得到目标数组 H=[h1,h2,,hn]H = [h_1, h_2, \dots, h_n]


    关键思路与贪心策略

    考虑相邻两块积木的高度差:

    • 如果 hi>hi1h_i > h_{i-1},说明在第 ii 块积木上需要比前一块多增加 hihi1h_i - h_{i-1} 次操作
    • 如果 hihi1h_i \leq h_{i-1},说明这部分操作可以被前面的区间操作覆盖

    核心公式: 设 h0=0h_0 = 0,则最少操作次数为:

    ans=i=1nmax(0,hihi1)\text{ans} = \sum_{i=1}^n \max(0, h_i - h_{i-1})

    算法正确性证明

    从构造角度理解:

    • 第一次操作区间 [1,n][1, n],将所有积木高度 +1+1
    • 对于每个 ii,如果 hi>hi1h_i > h_{i-1},需要额外进行 hihi1h_i - h_{i-1} 次以 ii 为起点的区间操作
    • 这样保证每块积木达到目标高度,且操作次数最少

    从差分角度理解:

    • 设差分数组 di=hihi1d_i = h_i - h_{i-1}(其中 h0=0h_0 = 0
    • 每次区间 [L,R][L, R]11 相当于 dLd_L11dR+1d_{R+1}11
    • 最终 d1=h1d_1 = h_1di=hihi1d_i = h_i - h_{i-1}i2i \geq 2
    • 最少操作次数等于所有正差分之和

    代码解析

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define pii pair< int,int >
    
    int const N = 1e5 + 10;
    int h[N];
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr), cout.tie(nullptr);
        
        int n;
        cin >> n;
        
        // 读入目标高度序列
        for (int i = 1; i <= n; i++)
            cin >> h[i];
        
        int ans = 0;
        
        // 计算所有正差分之和
        for (int i = 1; i <= n; i++)
            if (h[i - 1] < h[i])
                ans += h[i] - h[i - 1];
        
        cout << ans;
        return 0;
    }
    

    代码逻辑

    1. 读入 nn 和目标高度数组 hh
    2. 初始化 ans=0ans = 0
    3. 遍历 ii11nn
      • 如果 hi>hi1h_i > h_{i-1},将差值加入答案
      • 隐含 h0=0h_0 = 0 的处理
    4. 输出结果

    复杂度分析

    • 时间复杂度O(n)O(n)
      只需一次线性扫描
    • 空间复杂度O(n)O(n)
      存储高度数组

    示例验证

    样例输入

    n = 5
    h = [2, 3, 4, 1, 2]
    

    计算过程

    • i=1i=1h1h0=20=2h_1 - h_0 = 2 - 0 = 2ans=2ans = 2
    • i=2i=2h2h1=32=1h_2 - h_1 = 3 - 2 = 1ans=3ans = 3
    • i=3i=3h3h2=43=1h_3 - h_2 = 4 - 3 = 1ans=4ans = 4
    • i=4i=4h4h3=14=3h_4 - h_3 = 1 - 4 = -3(不增加)
    • i=5i=5h5h4=21=1h_5 - h_4 = 2 - 1 = 1ans=5ans = 5

    输出5,与样例一致。


    算法优势

    • 高效简洁O(n)O(n) 时间复杂度,O(n)O(n) 空间复杂度
    • 易于实现:核心代码仅需几行
    • 正确性保证:基于差分数组的严格数学推导

    该解法充分利用了问题的特殊结构,通过分析相邻块的高度关系,避免了复杂的模拟过程,是本题的最优解法。

    • 1

    信息

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