寒假每日一题 -- 1月3号 区间覆盖长度

区间覆盖总长

Submit Code ] [ Top 20 Runs ] [ Runs Status ]
Acceteped : 354Submit : 956
Time Limit : 3500 MSMemory 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,那么对答案没有贡献   

细节

  1. 排序不能用冒泡排序,时间复杂度太高了会超时,这里推荐C语言自带的快速排序函数
    C 库函数 – qsort() | 菜鸟教程 (runoob.com)
  2. 这个题用结构体比用数组方便一些(排序那里),所以还没有学到结构体的快快去预习吧
  3. 每次处理完一条边以后记得更新right值

代码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值