题目描述
有一个长度为整数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组整数,每组有一对数字。
输出
可能有多组输入数据,对于每组输入数据,输出一个数,表示移走所有区间的树之后剩下的树的个数。
样例输入
4 2
1 2
0 2
11 2
1 5
4 7
0 0
样例输出
2 5
思想:首先对输入的区间进行一stat的升序排序,然后进行遍历,并实时记录最大的end,判断第i+1的start-maxend是否大于2
若是大于则将sum+=a[i+1]-maxend-1.
AC代码:
#include <iostream> #include <cstdio> #include <algorithm> #define Max 10005 using namespace std; struct range { int start; int end; }tree[Max]; bool compare(range a,range b) { return a.start<b.start; } int main(void) { freopen("in.txt","r",stdin); int L,n; while(scanf("%d%d",&L,&n)!=EOF&&(L||n)) { int sum=0; for(int i=1;i<=n;i++) scanf("%d%d",&tree[i].start,&tree[i].end); sort(tree+1,tree+1+n,compare); int maxend=0; sum+=tree[1].start-0; for(int i=1;i<=n-1;i++) { if(tree[i].end>maxend) maxend=tree[i].end; if(tree[i+1].start-maxend>=2) sum+=tree[i+1].start-maxend-1; } if(tree[n].end>maxend) maxend=tree[n].end; sum+=L-maxend; printf("%d ",sum); } fclose(stdin); return 0; }