分析
2025-07-01 21:48:39
发布于:福建
6阅读
0回复
0点赞
题干信息解读
题目描述了一条长度为l的马路上均匀分布的树木(位置0到l),需要处理m个施工区域(可能重叠),移除这些区域内的所有树木后统计剩余树木数量。输入格式要求先读入l和m,再读入m对(u,v)表示施工区间24。输出仅需一个整数表示剩余树木数量
整体做题思路
1.初始化标记数组:创建长度为l+1的数组,初始值设为1表示所有位置有树。
2.处理施工区域:遍历每个区间,将对应数组位置标记为0表示移树。
3.统计剩余树木:遍历数组统计值为1的元素数量。
难点与注意事项
1.数组边界:需包含位置0和l的树木。
2.区间重叠处理:重复标记不会影响结果,只需最终状态
3.数据规模:l最大1e4,使用普通数组即可。
答案
#include <bits/stdc++.h>
using namespace std;
int main() {
// 定义变量:l表示马路长度,m表示区域数量
// u和v表示每个区域的起止点,count用于计数剩余树木
int l, m, u, v, count = 0;
// 输入马路长度和区域数量
cin >> l >> m;
// 创建vector数组trees,大小为l+1(包含0到l的位置)
// 初始化为1表示所有位置都有树
vector<int> trees(l + 1, 1);
// 处理每个区域
while (m--) {
// 输入区域的起止点
cin >> u >> v;
// 将该区域内的树标记为移除(设为0)
for (int i = u; i <= v; i++)
trees[i] = 0;
}
// 统计剩余树木数量
for (int i = 0; i <= l; i++)
count += trees[i];
// 输出结果
cout << count;
return 0;
}
代码说明:
1.使用vector容器动态存储树木状态,初始值为1表示有树
2.通过双重循环处理每个移除区域,将对应位置标记为0
3.最后遍历统计未被移除的树木数量(值为1的位置)
复杂度分析
时间复杂度:O(m*l),最坏情况下需处理所有区间的每个位置38。
空间复杂度:O(l),仅需存储长度为l+1的数组9。
这里空空如也
有帮助,赞一个