描述

有一个长度为整数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;
}


点赞(2)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论