本文涉及知识点
C++贪心
一,选择最多不相交区间
将若干区间划分N组,每组任意两个元素都符合
。求N组最多能包括多少区间。M=v.size()
N==1:贪心
v按升序排序。
性质一:一定存在最优解,包括v[0]。否则将v[i1]替换成v[0]也是最优解。旧方案包括v[i1],且i1最小。
实现:如果v[0]能选择则选择,不能选择则抛弃。删除v[0]后,持续迭代,直到v为空。iMax已经选择的最大值,如果,则无法选择。
时间复杂度:O(MlogM),瓶颈在排序。
N组,最多不相交区间
和N==1类似。sGroupEnd记录 N组的最后一个元素的最大值,初始N个INT_MIN。
如果sGroupEnd的全部元素都大于等于v[0]的左端点s0,则抛弃v[0]。
否则 it= sGroupEnd.upper(e0)。 --it就是最优解。
性质二:。方案一:s0放到e1后,则右端点为
。方案二:s0放到e2后,则右端点为
。由于
,故方案二,优于方案一。
时间复杂度:O(MlogM)
样例:
【区间贪心】P1607 USACO09FEB Fair Shuttle G|省选-
二,N个区间选点。
每个区间至少需要M个点,总点数最少
v按升序排序。setHas记录已有值,对于每个v[i],统计符合的点数,如果<M,从大到小增加点。时间复杂度:O(NMlogNM)
样例:
【区间贪心 决策包容性】757. 设置交集大小至少为|2348
每个区间一个不同的点
每位同学都有自己的期望的座位区间,一个座位只能坐一个同学。从小到大枚举座位,如果有多个同学期望此座位,选择小的。
【区间贪心】B4160 BCSP-X 2024 12 月小学高年级组 排座位|普及+
【区间贪心】P3661 USACO17FEB Why Did the Cow Cross the Road I S|普及+
三,区间合并
性质一: 两个区间是否有交集
。必要性无需证明,下面证明充分性。
令x是两个区间的交点,如果,得证。否则
,x–也是交点。
如果能合并,则新区间为。
推论一:如果也符合性质一。
实现
以为第一关键字,
为第二关键字,升序排序。已经处理完v[
]合并后的最后一个区间为
,则v[i]只会和
相交,不会和其它区间相交。比如:
,即
。
时间复杂度:O(nlogn)
【区间贪心】P2434 SDOI2005 区间合并|普及
四,区间覆盖
区间[1,M]任意点必须被至少一个区间覆盖,求最少区间数。从1到M枚举m,如果没有区间包括m,无合法方案。否则取最大。
【区间贪心】P1668 [USACO04DEC] Cleaning Shifts S|普及+
五,区间分组
最多不相交区间类似,不同之处:所有区间都必须选择,求最小组数。
性质一:能追加到已有分组,则追加到已有分组不劣于增加新的分组。令。追加相当于:
。增加新组相当于:
。显然追加不劣于增加新组。
样例:
【区间贪心】P4873 USACO14DEC Cow Jog G|省选-
其它
【C++ 二分查找 区间贪心】2271. 毯子覆盖的最多白色砖块数|2021
【C++ 区间贪心】P9344 去年天气旧亭台|普及
















