首页 > 试题广场 >

校门外的树

[编程题]校门外的树
  • 热度指数:6427 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}某校大门外长度为 L 的马路上有一排树,每两棵相邻的树之间的间隔都是 1 米。我们可以把马路看成一个数轴,马路的一端在数轴 0 的位置,另一端在 L 的位置;数轴上的每个整数点,即 0,1,2,\dots,L,都种有一棵树。

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

输入描述:
\hspace{15pt}第一行输入两个整数 L,M,用空格隔开,表示马路的长度和地铁施工区域数,满足 1 \leqq L \leqq 100001 \leqq M \leqq 100

\hspace{15pt}接下来 M 行,每行输入两个整数 l_i,r_i,用空格隔开,表示第 i 个施工区域的起始点和终止点的坐标,满足 0 \leqq l_i \leqq r_i \leqq L


输出描述:
\hspace{15pt}输出一个整数,表示移除所有施工区域内(包括端点)树后,剩余的树的总棵树数。
示例1

输入

500 3
150 300
100 200
470 471

输出

298

说明

马路上共有 L+1=501 棵树。施工区域 [150,300] 中含有 151 棵,[100,200] 中含有 101 棵,[470,471] 中含有 2 棵。三个区域的重叠部分 [150,200] 有 51 棵被重复移除,所以实际移除的树数为 151+101+2-51=203,因此剩余 501-203=298 棵。
示例2

输入

10 2
2 5
4 8

输出

4

说明

马路上共有 11 棵树。区域 [2,5] 移除 4 棵,区域 [4,8] 移除 5 棵。重叠部分 [4,5] 有 2 棵被重复移除,所以实际移除 4+5-2=7 棵,剩余 11-7=4 棵。

备注:

#include <stdio.h>

int main() {
    int a, b;
    int c[100];
    int d[100];
    scanf("%d %d",&a,&b);
    for(int i=0;i<b;i++)
    {
        scanf("%d %d",&c[i],&d[i]);
    }
    int sc[a+1];
    for(int i=0;i<=a;i++)
    {
        sc[i]=1;
    }
    for(int i=0;i<b;i++)
    {
        for(int j=c[i];j<=d[i];j++)
        {
            sc[j]=0;
        }
    }
    int k=0;
    for(int i =0;i<=a;i++)
    {
        if(sc[i]==1)
        {
            k++;
        }
    }
    printf("%d\n",k);
    return 0;
}
发表于 2025-10-09 18:56:56 回复(0)
#include <stdio.h>

void shu(int a[],int l,int r,int L)
{
    for(int i=0;i<=L;i++)
    {
        if(i>=l&&i<=r)
        {
            a[i]=1;
        }
    }
}
int main() {
    int L,M;
    scanf("%d%d",&L,&M);
    int a[10000]={0};
    int n=M;
    for(int i=0;i<n;i++)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        shu(a,l,r,L);
    }
    int hen=0;
    for(int i=0;i<=L;i++)
    {
        if(a[i]==0)
        {
            hen++;
        }
    }
    printf("%d",hen);
}

发表于 2025-07-17 19:35:23 回复(0)