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;
}

代码解释:

  1. 使用 vector<pair<int, int>> regions 存储每个区域的起始点和终止点。
  2. 使用 sort 函数对 regions 进行排序,按照起始点从小到大排序。
  3. 使用 count 变量记录剩余树木的数量,初始值为 L + 1(马路长度加 1)。
  4. 遍历每个区域,计算该区域需要移除的树木数量。
  5. 如果当前区域的起始点在前一个区域的范围内,说明有重合,需要调整当前区域的起始点和终止点,避免重复计算。
  6. count 中减去移除的树木数量。
  7. 最后输出 count 的值,即剩余的树木数量。

代码中用到的技巧:

  • 使用 pair 类型来存储每个区域的起始点和终止点。
  • 使用 sort 函数对区域进行排序,便于处理重合的情况。
  • 使用 max 函数来计算当前区域和前一个区域的终止点中较大的一个。

总结:

本代码通过遍历每个区域,计算移除的树木数量,并根据重合的情况进行调整,最终得到了剩余树木的数量。代码逻辑清晰,易于理解,并使用了一些 C++ 的技巧,提高了代码的可读性和效率。

C++ 代码实现:马路上的树木移除

原文地址: https://www.cveoy.top/t/topic/rCA 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录