描述
有一个长度为整数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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复