# [NOIP2005 普及组] 校门外的树
## 题目描述
某校大门外长度为 $l$ 的马路上有一排树,每两棵相邻的树之间的间隔都是 $1$ 米。我们可以把马路看成一个数轴,马路的一端在数轴 $0$ 的位置,另一端在 $l$ 的位置;数轴上的每个整数点,即 $0,1,2,\dots,l$,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
假设这道题没有说有重合的部分
include<stdio.h>
int main()
{//
int s,l,m,u,v,i,a[10000],w,j;
scanf("%d %d",&l,&m) ;
for(i=0;i<m;i++)
{
scanf("%d %d",&u,&v);
w=v-u+1;
a[i]=w;
}
for(j=0;j<i;j++)
{
l=l-a[j];
}
printf("%d",l);
return 0;
有重合的地方
//
#include<stdio.h>
int main()
{
int i,l,m,u,v,a[10000],cnt=0;
scanf("%d %d",&l,&m);
for(i=0;i<=l;i++)
{
a[i]=1; //把有树定义为1
}
for(i=1;i<=m;i++)
{
scanf("%d %d",&u,&v);
for(;u<=v;u++)
{
a[u]=0; //每个数对应一个坐标 被砍则为0
}
}
for(i=0;i<=m;i++)
{
if(a[i]==1)
{
cnt++; (但我解出来不对)
}
}
printf("%d",cnt);
return 0;
}
*/
我参考的正确答案:
#include<stdio.h>
int main(){
int L,M,b[10000]={0},sum=0,c,d;
scanf("%d %d",&L,&M);
for(int i=0;i<=L;i++){
b[i]=1;
}
for(int i=0;i<M;i++){
scanf("%d %d",&c,&d);
for(;c<=d;c++){
b[c]=0;
}
}
for(int i=0;i<=L;i++){
sum+=b[i];
}
printf("%d",sum);
return 0;
}