C++ 代码实现:马路上的树木移除
C++ 代码实现:马路上的树木移除
题目描述:
某校大门外长度为 L 的马路上有一排树,每两棵相邻的树之间的间隔都是 1 米。我们可以把马路看成一个数轴,马路的一端在数轴 0 的位置,另一端在 L 的位置;数轴上的每个整数点,即 0,1,2,……,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入
第一行有两个整数 L(1 <= L <= 10000)和 M(1 <= M <= 100),L 代表马路的长度,M 代表区域的数目,L 和 M 之间用一个空格隔开。接下来的 M 行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
对于 20% 的数据,区域之间没有重合的部分; 对于其它的数据,区域之间有重合的情况。
输出
包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
样例输入
500 3
150 300
100 200
470 471
样例输出
298
C++ 代码实现:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int L, M;
cin >> L >> M;
vector<pair<int, int>> regions;
for (int i = 0; i < M; i++) {
int start, end;
cin >> start >> end;
regions.push_back(make_pair(start, end));
}
// 排序区域,按起始点从小到大排序
sort(regions.begin(), regions.end());
int count = L + 1; // 初始树的数量为马路长度加1
// 遍历区域,计算移走的树的数量
for (int i = 0; i < M; i++) {
int start = regions[i].first;
int end = regions[i].second;
// 如果当前区域的起始点在前一个区域的范围内,说明有重合
if (i > 0 && start <= regions[i-1].second) {
start = regions[i-1].second + 1; // 起始点移动到前一个区域的终止点之后
end = max(end, regions[i-1].second); // 终止点取当前区域和前一个区域的终止点中较大的一个
}
count -= (end - start + 1);
}
cout << count << endl;
return 0;
}
代码解释:
- 使用
vector<pair<int, int>> regions存储每个区域的起始点和终止点。 - 使用
sort函数对regions进行排序,按照起始点从小到大排序。 - 使用
count变量记录剩余树木的数量,初始值为L + 1(马路长度加 1)。 - 遍历每个区域,计算该区域需要移除的树木数量。
- 如果当前区域的起始点在前一个区域的范围内,说明有重合,需要调整当前区域的起始点和终止点,避免重复计算。
- 从
count中减去移除的树木数量。 - 最后输出
count的值,即剩余的树木数量。
代码中用到的技巧:
- 使用
pair类型来存储每个区域的起始点和终止点。 - 使用
sort函数对区域进行排序,便于处理重合的情况。 - 使用
max函数来计算当前区域和前一个区域的终止点中较大的一个。
总结:
本代码通过遍历每个区域,计算移除的树木数量,并根据重合的情况进行调整,最终得到了剩余树木的数量。代码逻辑清晰,易于理解,并使用了一些 C++ 的技巧,提高了代码的可读性和效率。
原文地址: https://www.cveoy.top/t/topic/rCA 著作权归作者所有。请勿转载和采集!