描述
有一个长度为整数L(1<=L<=10000)的马路,可以想象成数轴上长度为L的一个线段,起点是坐标原点,在每个整数坐标点有一棵树,即在0,1,2,...,L共L+1个位置上有L+1棵树。
现在要移走一些树,移走的树的区间用一对数字表示,如 100 200表示移走从100到200之间(包括端点)所有的树。
可能有M(1<=M<=100)个区间,区间之间可能有重叠。现在要求移走所有区间的树之后剩下的树的个数。
输入
两个整数L(1<=L<=10000)和M(1<=M<=100)。 接下来有M组整数,每组有一对数字。
输出
可能有多组输入数据,对于每组输入数据,输出一个数,表示移走所有区间的树之后剩下的树的个数。
样例输入1
4 2
1 2
0 2
11 2
1 5
4 7
0 0
样例输出1
2
5
#include <stdio.h> //数组合并 int main() { int l,n; while (scanf("%d%d",&l,&n)&&l&&n) { int i,j; int left[100]={0},right[100]={0},start,flag=1,end; for (i=0;i<n;i++) scanf("%d%d",&left[i],&right[i]); for (i=0;i<n-1;i++) //对区间从小到大排序 { for (j=i+1;j<n;j++) { if (left[i]>left[j]) { int tem=left[i]; left[i]=left[j]; left[j]=tem; tem=right[i]; right[i]=right[j]; right[j]=tem; } else if (left[i]==left[j]&&right[i]>right[j]) { int tem=right[i]; right[i]=right[j]; right[j]=tem; } } } start=left[0]; end=right[0]; for (i=0;i<n;i++) { if (i==n-1||end<left[i+1]) //处理重叠区间后 { l-=end-start+1; start=left[i+1]; } if (right[i+1]>end) end=right[i+1]; } printf("%d\n",l+1); } return 0; }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复