解题思路:
        建立一个数组来保存数轴上的树的状态,另一个二维数组来保存每次输入的区域,在输入输入的区域的同时,改变信号值的状态,最终遍历数组来统计所有的未改变的值的个数.
注意事项:

        数组的定义要比L值多一个,因为0也为有效值.

参考代码:



/* 题目描述


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


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



输入


输入的第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。



输出


输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。



样例输入

500 3

150 300

100 200

470 471

样例输出

298 */

#include<stdio.h>

int main(){

int l,m,count=0;

int i,j;

scanf ("%d",&l);

scanf ("%d",&m);

int a[l+1],b[m][2];  //定义一个长度为l+1(包括0坐标)的数组来表示坐标轴,和一个m行2列的二维数组来存储没一个区域的起始结束位置.

for(i=0;i<=l;i++){

a[i]=1;      //每一个数组元素中存有这棵树的状态,初始都存在,用1来表示

}

for (i=0;i<m;i++){

scanf ("%d",&b[m][0]);

scanf ("%d",&b[m][1]);

for (j=b[m][0];j<=b[m][1];j++){

a[j]=0;              //读入一块区域的同时给这块区域砍树,被砍了的坐标变为0;

}                        //用状态值来表示避免了计算重复区域的麻烦,已赋值0的还是赋值0

}

for(i=0;i<=l;i++){

if (a[i]==1){

count++;     //统计没被砍的树(值为1)

}

}

printf ("%d",count);

return 0;

}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论