当前位置:   article > 正文

蓝桥杯——区间合并_合并区域蓝桥杯

合并区域蓝桥杯

问题描述:

           

给定 n 个区间 [li,ri],要求合并所有有交集的区间。

注意如果在端点处相交,也算有交集。

输出合并完成后的区间个数。

例如:[1,3]] 和 [2,6] 可以合并为一个区间 [1,6][1,6]。

输入格式

第一行包含整数 n。

接下来 n 行,每行包含两个整数 l 和 r。

输出格式

共一行,包含一个整数,表示合并区间完成后的区间个数。

数据范围

1≤n≤1000001,
−10^9≤li≤ri≤10^9

输入样例:
  1. 5
  2. 1 2
  3. 2 4
  4. 5 6
  5. 7 8
  6. 7 9
输出样例:
3

解题思路: 

           这道题目要我们求的是区间合并的题目,因此我们采用区间合并的思想。首先,我们把保存的数据按照第一个数据的大小进行排序,这里我们采用的是qsort排序方法(c语言自带的)。当排完序之后我们从第一个数据开始进行区间合并。这里有三种情况。

第一种:后面的这个数据的左右两个端点在前面这个数据的里面,这种情况下我们不更新区间,区间个数不变。

第二种:后面的这个数据的左端点在前面这个数据的里面,右端点在外面,因此我们需要更新区间的右端点为后面这个数据右端点的值,区间个数不变。

第三种:后面的这个数据的左端点在前面这个数据的外面,这个时候我们需要去将区间个数加一,并且把比较的区间换成这个区间。

注意:当前的讨论是在数据有序的情况下,因为只有这样才不会出现后面的数据可以加入上一个区间这种情况。

代码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define N 100010
  4. int n,arr[N][2];
  5. int cmp(const void* a,const void* b)//由于是根据数组的第一个数据进行排序,所以这里是采用[0]
  6. {
  7. return ((int *)a)[0]-((int *)b)[0];
  8. }
  9. int main()
  10. {
  11. int ans=1,l,r;
  12. scanf("%d",&n);
  13. for(int i=0;i<n;i++)scanf("%d %d",&arr[i][0],&arr[i][1]);
  14. qsort(arr,n,2*sizeof(int),cmp);
  15. l=arr[0][0],r=arr[0][1];
  16. for(int i=1;i<n;i++)
  17. {
  18. if((arr[i][0]<=r)&&(arr[i][1]>r)) r=arr[i][1];
  19. if(arr[i][0]>r)
  20. {
  21. ans++;
  22. l=arr[i][0],r=arr[i][1];
  23. }
  24. }
  25. printf("%d",ans);
  26. return 0;
  27. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/460899
推荐阅读
相关标签
  

闽ICP备14008679号