1 条题解
-
0
题目分析
本题要求用最少的区间加 操作,将初始全 的序列变为目标高度序列 。
问题抽象
给定初始全零数组 ,要通过最少的“区间 ”操作,得到目标数组 。
关键思路与贪心策略
考虑相邻两块积木的高度差:
- 如果 ,说明在第 块积木上需要比前一块多增加 次操作
- 如果 ,说明这部分操作可以被前面的区间操作覆盖
核心公式: 设 ,则最少操作次数为:
算法正确性证明
从构造角度理解:
- 第一次操作区间 ,将所有积木高度
- 对于每个 ,如果 ,需要额外进行 次以 为起点的区间操作
- 这样保证每块积木达到目标高度,且操作次数最少
从差分角度理解:
- 设差分数组 (其中 )
- 每次区间 加 相当于 加 , 减
- 最终 ,()
- 最少操作次数等于所有正差分之和
代码解析
#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; }代码逻辑:
- 读入 和目标高度数组
- 初始化
- 遍历 从 到 :
- 如果 ,将差值加入答案
- 隐含 的处理
- 输出结果
复杂度分析
- 时间复杂度:
只需一次线性扫描 - 空间复杂度:
存储高度数组
示例验证
样例输入:
n = 5 h = [2, 3, 4, 1, 2]计算过程:
- :,
- :,
- :,
- :(不增加)
- :,
输出:
5,与样例一致。
算法优势
- 高效简洁: 时间复杂度, 空间复杂度
- 易于实现:核心代码仅需几行
- 正确性保证:基于差分数组的严格数学推导
该解法充分利用了问题的特殊结构,通过分析相邻块的高度关系,避免了复杂的模拟过程,是本题的最优解法。
- 1
信息
- ID
- 4269
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者