1 条题解

  • 0
    @ 2026-7-15 2:06:52

    思路

    马路从 0 到 L,每个整数点都有一棵树,一共 L + 1 棵。

    最简单的做法:开一个数组当"标记牌",tree[i] = 1 表示位置 i 的树还在。每读入一个区域 [a, b],就把 a 到 b 之间所有位置的标记改成 0。最后数一数还剩几个 1。

    代码

    #include <stdio.h>
    
    int tree[10001];
    
    int main() {
        int L, M;
        scanf("%d %d", &L, &M);
    
        // 一开始所有树都在
        for (int i = 0; i <= L; i++) tree[i] = 1;
    
        // 逐个区域移走树
        for (int i = 0; i < M; i++) {
            int a, b;
            scanf("%d %d", &a, &b);
            for (int j = a; j <= b; j++) tree[j] = 0;
        }
    
        // 数剩下的树
        int count = 0;
        for (int i = 0; i <= L; i++)
            if (tree[i] == 1) count++;
    
        printf("%d\n", count);
        return 0;
    }
    

    易错点

    • 树的总数是 L + 1 棵(0 位置也有一棵),不是 L 棵。
    • 区域端点上的树也要移走,所以循环是 j = a; j <= b,别写成 j < b。
    • 区域可能重合,重复移走同一棵树没关系,因为置 0 两次效果一样。
    • 1

    信息

    ID
    2
    时间
    1000ms
    内存
    256MiB
    难度
    1
    标签
    递交数
    3
    已通过
    2
    上传者