测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A21372. 摧毁积木塔(tower.cpp)

填空题 中等

题目描述

摧毁积木塔(tower.cpp)

题目描述

圣诞节联欢活动有拆积木塔游戏。n 座积木塔(编号 1~n),第 i 座塔高度为 hᵢ(由 hᵢ个正方体积木组成,长和宽均为 1)。积木块分为:

内部块:上下左右四个方向均有相邻积木块或地面;

边界块:非内部块。每次操作摧毁当前所有边界块,求摧毁所有积木块所需的操作次数。

输入描述

第一行包含整数 n(1≤n≤1e5);第二行包含 n 个整数 h₁、h₂、…、hₙ(1≤hᵢ≤1e5),表示每座塔的高度。

输出描述

输出所需操作次数。

样例输入1

2 1 4 6 2 2

样例输出1

3

样例输入2

7

 3 3 3 1 3 3 3

样例输出2

2

样例1解释:

每次边界块都用红色标记。第一次操作后,还剩下四个块,第二次操作后只剩下一个。这最后一个块在第三次操作中被摧毁。

参考答案

#include <bits/stdc++.h> usingnamespacestd; constint N = 1e5 + 5;  // 数组大小,适配题目数据范围 int h[N];  // 存储每根柱子的初始高度 int f[N];  // f[i]:第i根柱子完全摧毁的最少操作次数 int main()  {     int n;     cin >> n;     for (int i = 1; i <= n; ++i)      {         cin >> h[i];         f[i] = h[i];  // 初始化:最少操作次数不超过自身高度     }     // 第一次遍历:从左到右,考虑左侧柱子的限制     for (int i = 2; i <= n; ++i)      {  // i从2开始(避免i-1=0越界)         f[i] = min(f[i], f[i-1] + 1);     }     // 第二次遍历:从右到左,考虑右侧柱子的限制     for (int i = n-1; i >= 1; --i) // i从n-1开始(避免i+1=n+1越界)     {           f[i] = min(f[i], f[i+1] + 1);     }     // 找所有f[i]的最大值(总操作次数由耗时最久的柱子决定)     int ans = 0;     for (int i = 1; i <= n; ++i)      {         ans = max(ans, f[i]);     }     cout << ans << endl;     return0; }
上一题 下一题