题目描述
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是 1 米。我们可以把马路看成一个数轴,马路的一端在数轴 00 的位置,另一端在 LL 的位置;数轴上的每个整数点,即 0,1,2,……,L0,1,2,……,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入描述
第一行有两个整数:LL(1 \le L \le 100001≤L≤10000)和 MM(1 \le M \le 1001≤M≤100),LL 代表马路的长度,MM 代表区域的数目,LL 和 MM 之间用一个空格隔开。接下来的 MM 行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
输出描述
包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
**样例输入 **
500 3
150 300
100 200
470 471
样例输出
298
代码:
/*
将0-L的所有点放入array数组中并且赋值为-1,区域端点放入另一个数组arrayNum中(区域两端点相邻存放)
取出arrayNum数组中端点值(注意:此题端点处即为下标)对array数组两端点之间(包括两端点)的数值赋
值为0,最后通过遍历数组array,找出-1的值,就是剩余的树.
*/
#include<stdio.h> //头文件
int restTree(); //函数声明
int temp; //定义全局变量
int main(void){
printf("%d",restTree());//调用函数
return 0;
}
int restTree(void){
/*
L:长度 M:区域 M1,M2为区域的端点值
数组array存放长度为L的数值
数组arrayNum存放区域端点值
*/
int i,j,L,M,M1,M2,t,num,array[10001],arrayNum[100001];
char c; //接收空格字符
scanf("%d%c%d",&L,&c,&M); //输入L和M,L和M之间的空格用%c替代
for(i=0;i<=L;i++){
array[i]=-1; //起初所有点设为-1
}
for(i=0;i<M;i++){
scanf("%d%c%d",&M1,&c,&M2); //输入区域端点值
//将端点值放入数组arrayNum中
for(j=temp;j<M*2;j++){
arrayNum[j]=M1;
arrayNum[j+1]=M2;
break;
}
temp=temp+2; //全局变量temp,上述temp需要指向数组arrayNum的下标,不然会被覆盖掉
}
//对端点间的值赋值0
for(i=0;i<M*2;i++){
for(j=arrayNum[i];j<=arrayNum[i+1];j++){
array[j]=0;
}
i=i+1;
}
//遍历数组array,找出剩余树
for(i=0;i<=L;i++){
if(array[i]==-1){
num++;
}
}
return num; //返回剩余树
}