文章

【GESP】C++三级练习 luogu-P1047 [NOIP 2005 普及组] 校门外的树

GESP C++三级练习,一维数组练习,难度★★☆☆☆。

luogu-P1047 [NOIP 2005 普及组] 校门外的树

题目要求

题目描述

某校大门外长度为 $l$ 的马路上有一排树,每两棵相邻的树之间的间隔都是 $1$ 米。我们可以把马路看成一个数轴,马路的一端在数轴 $0$ 的位置,另一端在 $l$ 的位置;数轴上的每个整数点,即 $0,1,2,\dots,l$,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入格式

第一行有两个整数,分别表示马路的长度 $l$ 和区域的数目 $m$。

接下来 $m$ 行,每行两个整数 $u, v$,表示一个区域的起始点和终止点的坐标。

输出格式

输出一行一个整数,表示将这些树都移走后,马路上剩余的树木数量。

输入输出样例 #1

输入 #1

1
2
3
4
500 3
150 300
100 200
470 471

输出 #1

1
298

数据范围

  • 对于 $20\%$ 的数据,保证区域之间没有重合的部分。
  • 对于 $100\%$ 的数据,保证 $1 \leq l \leq 10^4$,$1 \leq m \leq 100$,$0 \leq u \leq v \leq l$。

题目分析

解题思路

本题的解题思路如下:

  1. 问题本质:
    • 给定一条长度为l的马路,每隔1米种一棵树
    • 需要移除m个区间内的所有树木
    • 计算最终剩余的树木数量
  2. 解题关键:
    • 使用数组记录每个位置是否有树
    • 处理多个可能重叠的区间
    • 统计未被移除的树木数量
  3. 实现思路:
    • 创建长度为l+1的数组,初始化所有位置为1(表示有树)
    • 对于每个需要移除树木的区间[u,v]:
      • 将区间内所有位置标记为0(表示移除树木)
    • 最后遍历整个数组,统计值为1的位置数量
  4. 复杂度分析:
    • 时间复杂度:$O(l + m \times k)$,其中k为区间平均长度
    • 空间复杂度:$O(l)$,需要一个长度为l+1的数组


示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <array>

// 定义一个长度为10005的数组,用于标记每个位置是否有树
// 初始值为1表示有树,0表示没有树
std::array<int, 10005> result_ary;
int main() {
    // l表示马路长度,m表示需要移除树木的区域数量
    int l, m;
    std::cin >> l >> m;
    
    // 初始化数组,所有位置都种有树
    result_ary.fill(1);
    
    // 处理每个需要移除树木的区域
    for (int i = 0; i < m; i++) {
        // a和b分别表示区域的起始和结束位置
        int a, b;
        std::cin >> a >> b;
        // 将区域内的所有树木标记为已移除(值设为0)
        for (int j = a; j <= b; j++) {
            result_ary.at(j) = 0;
        }
    }
    
    // 统计剩余树木的数量
    int count = 0;
    for (int i = 0; i <= l; i++) {
        if (result_ary.at(i)) {
            count++;
        }
    }
    
    // 输出结果
    std::cout << count;
    return 0;
}                  

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

本文由作者按照 CC BY 4.0 进行授权