区间覆盖总长 | ||
[ Submit Code ] [ Top 20 Runs ] [ Runs Status ] | ||
Acceteped : 354 | Submit : 956 | |
Time Limit : 3500 MS | Memory Limit : 65536 KB | |
Description | ||
题目描述 在X轴上给你一些线段,问被这些线段覆盖的区间长。 输入 每个样例的第一行是一个整数K(K≤10000),表示线段的个数,如果K=0表示输入结束。以后的K行,每行为一个线段的左右端点x1,x2,(0 ≤ x1 < x2 ≤ 1,000,000,000)。 输出 每行输出一个样例的结果。 样例输入 2 1 2 2 3 3 1 3 0 2 5 6 0 样例输出 2 4 |
思路
- 对于每条边都可以用一个长度为2的数组,或者用结构体来存储
- 对存下来的所有边进行排序,按左端点的坐标升序排列
- 循环遍历处理所有的边,计算每一条边对最终答案的贡献,
- 维护一个right值,存储所有已处理边中最靠右的端点的坐标
因为按左端点坐标进行了排序,所以对每一条当前遍历到的边,只有以下三种情况:
1.当前边左端点大于right值,对答案贡献就是本条边的长度
2. 当前边左端点小于right值,右端点大于right,对答案的贡献为【右端点值 - right】
3. 当前边左端点和右端点值都小于right,那么对答案没有贡献
细节
- 排序不能用冒泡排序,时间复杂度太高了会超时,这里推荐C语言自带的快速排序函数
C 库函数 – qsort() | 菜鸟教程 (runoob.com) - 这个题用结构体比用数组方便一些(排序那里),所以还没有学到结构体的快快去预习吧
- 每次处理完一条边以后记得更新right值