题意
数轴上有 n (1<=n<=25000)个闭区间 [ai, bi],选择尽量少的区间覆盖一条指定线段 [1, t]( 1<=t<=1,000,000)。
覆盖整点,即(1,2)+(3,4)可以覆盖(1,4)。
不可能办到输出-1
思路
- 此题是一个贪心问题,需要找到局部最优解,从题意分析,每一次取最大的区间右边界则是局部最优的,更容易到达目标边界。
- 首先进行区间排序,区间左边界升序,右边界降序
- 然后进行处理无用区间,排序后如果第一个区间的左边界大于1,则是无解的(永远无法覆盖1这个点),直接输出-1;
- 然后就是找最大的右边界,找到的这些区间必须是相互重叠或者相连的,说明下一个最大区间的左边界必须在上一个最大区间之内或者相连。
例如 (1,15) ,(14, 27) 或者(1,8),(9,20)
- 找到一个最大的右边界,结果累加一
总结
- 在此题中,非常重要的就是区间的连续性,区间不能断,所以需要一定的条件保证区间断了之后,之前累加的结果不算,直接输出-1;
- 贪心问题最重要的就是找到局部最优解,并且能够证明。
代码
#include<cstdio>
#include<algorithm>
#include<list>
using namespace std;
struct interval {
int a;
int b;
bool operator <(const interval& P) {
if(a!=P.a)
return a < P.a;
return b>P.b;
}
};
int c = 0;
int c1;
bool ex