7-73 校门外的树 (5分)

7-73 校门外的树 (5分)
 

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

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

输入格式:

输入的第一行是整数L(1< L < 10000),L代表马路的长度,单位是米。 第二行是整数M(0 < M < 100),M代表车站的数目。 接下来的M行,每行包含两个不同的整数,用一个空格隔开,表示一个车站所占区域的起始点和终止点的坐标。

输出格式:

一个整数,表示马路上剩余的树的数目。

输入样例:

500 
3
150 300
100 200
470 471
 

输出样例:

298

代码讲解,这题我的想法是尽可能的合并,因为要合并,所以要先排序,要按照先a的递增排序,如果a有相等的情况就按b的递增排序。
这样就放边合并相互的集合了。


#include<stdio.h>
#include<stdlib.h>
typedef struct shu
{
 int a, b;
 
}shu;
int cmp(const void *x,const void *y)
{
  shu *a=(shu*)x;
  shu *b=(shu *)y;
  if((*a).a-(*b).a!=0)
 return (*a).a-(*b).a;
 else
   return (*a).b-(*b).b;
}
int main()
{
 int l;
 scanf("%d",&l);
 int n;
 scanf("%d",&n);
 shu arr[n];
 int i;
 for(i=0;i<n;i++)
 {
  scanf("%d %d",&(arr[i].a),&(arr[i].b));
  
 }
 qsort(arr,n,sizeof(shu),cmp);
 int x=arr[0].a,y=arr[0].b;
 int sum=0;
 for(i=1;i<n;i++)
 {
  if(y>arr[i].a)
  {
   if(y<arr[i].b)
      y=arr[i].b;
  
  }
  else
  {
 
   sum+=y-x+1;
   x=arr[i].a;
   y=arr[i].b;  
   
  }
 }
 sum+=y-x+1;
 printf("%d\n",l+1-sum);
 return 0;
}
 
posted @ 2020-10-21 17:02  罪梦者  阅读(289)  评论(0)    收藏  举报