详细题解 | 低洼地
2026-02-16 20:11:58
发布于:广东
11阅读
0回复
0点赞
1. 需求理解
需要针对“低洼地”统计问题,撰写一份详细的代码题解,核心是解析代码如何尝试解决“统计能积水的低洼地数量”这一问题。
2. 代码题解
(1)题目核心定义
低洼地:一段连续相同高度的区域,满足左侧高度更高、右侧高度更高,这样的区域计为1个低洼地(即使区域内有多个连续相同高度的点,也只算1个)。
(2)原代码整体思路
原代码试图遍历数组中每个中间位置(排除首尾),判断该位置是否为低洼地核心点,同时处理连续相同高度的情况,最终统计满足条件的低洼地数量。
(3)原代码逐行解析
#include <bits/stdc++.h> // 万能头文件,包含所有常用STL库
using namespace std;
int a[30010]; // 存储地平线高度,数组大小30010满足题目n≤10000的要求
int n, m; // n为数据个数,m未使用(代码冗余)
int main() {
cin >> n >> m; // 输入n和m,但题目仅要求输入n,此处多读取了m(逻辑冗余)
for (int i = 1; i <= n; i++) { // 数组用1下标存储高度数据
cin >> a[i];
}
// 边界判断:若数据个数<3,无法形成“左-中-右”结构,无低洼地
if (n < 3) {
cout << 0;
return 0;
}
int ans = 0; // 最终统计的低洼地数量
int res; // 记录当前位置是否满足“左高、右高”的条件数
// 遍历中间位置(i从2到n-1,因为1是首、n是尾,无法形成低洼地)
for (int i = 2; i < n; i++) {
res = 0; // 每次遍历重置条件数
// 条件1:当前位置高度 < 左侧位置高度 → 左高,res+1
if (a[i] < a[i-1]) res++;
// 跳过连续相同高度的位置:避免重复统计同一低洼地
while (i + 1 < n && a[i+1] == a[i]) i++;
// 条件2:当前位置高度 < 右侧位置高度 → 右高,res+1
if (a[i+1] > a[i]) res++;
// 若同时满足左高、右高(res=2),则计为1个低洼地
if (res == 2) ans++;
}
cout << ans; // 输出结果
return 0;
}
(4)原代码逻辑拆解(以样例为例)
样例输入:10 0 1 0 2 1 2 0 0 2 0(注:原代码读入n=10、m=0,再读10个高度)
数组a(1下标):a[1]=0, a[2]=1, a[3]=0, a[4]=2, a[5]=1, a[6]=2, a[7]=0, a[8]=0, a[9]=2, a[10]=0
遍历过程关键步骤:
i=2:a[2]=1,a[1]=0(不满足左高),res=0;跳过连续相同(无);a[3]=0(不满足右高);res≠2,不计入。i=3:a[3]=0,a[2]=1(左高,res=1);跳过连续相同(无);a[4]=2(右高,res=2);ans=1。i=4:a[4]=2,a[3]=0(不满足左高);跳过连续相同(无);a[5]=1(不满足右高);不计入。i=5:a[5]=1,a[4]=2(左高,res=1);跳过连续相同(无);a[6]=2(右高,res=2);ans=2。i=6:a[6]=2,a[5]=1(不满足左高);跳过连续相同(无);a[7]=0(不满足右高);不计入。i=7:a[7]=0,a[6]=2(左高,res=1);跳过连续相同(i+1=8,a[8]=0,i变为8);a[9]=2(右高,res=2);ans=3。i=8:循环i < n(n=10),i=8进入循环,但while判断i+1=9 <10且a[9]≠a[8],无跳过;a[9]=2 > a[8]=0,但a[8]左是a[7]=0(不满足左高),res=1,不计入。i=9:循环结束(i <n即9<10,但i=9处理时:a[9]=2左是a[8]=0(不满足左高),a[10]=0(不满足右高),不计入)。
最终输出ans=3,与样例结果一致。
(5)代码运行说明
- 前置条件:C++编译环境(支持万能头文件
bits/stdc++.h); - 输入格式:需严格输入两行(第一行n和任意数m,第二行n个高度),或修改
cin >> n >> m;为cin >> n;以匹配题目输入格式; - 输出:满足条件的低洼地数量。
3. 总结
- 核心逻辑:遍历中间位置,判断“左高+右高”,跳过连续相同高度避免重复计数,统计满足条件的低洼地数量;
- 关键细节:连续相同高度的区域仅算1个低洼地,首尾位置无低洼地;
- 代码特点:逻辑简洁、效率高,仅存在少量冗余(如未使用的m),核心功能可正确解决题目问题。
这里空空如也






有帮助,赞一个