区间覆盖问题总结(贪心)

1.求一个区间是否包含另一个小区间:将两种区间都按右端点排序,每一次比较左端点是否包含在内即可。
2.最少的区间覆盖一段长度:按照左端点递增,如果左端点相同右端点也递增排序(递减是一样的),每一次这样贪心地选:
记录最远能覆盖距离mx,跳过右端点小于等于mx的情况,选左端点刚好在mx范围内,且右端点最远的线段。
模拟一下即可。
3.选择尽量少的点,覆盖所有所有线段:按左端点递增,右端点递增,每一次贪心地将点往后放,使得其放在多个线段的重叠部分,如果某一线段的左端点超出范围,ans++。
注意一下这种情况:
-------
   --
      -----
第二根线段明显可以将范围缩小,所以要记录目前选点的范围,把右端点更小的更新到范围里面。
------
       ------
这种情况明显就要将ans++,右端点变成下面的那一个了。
4.选出多个区间,使得区间没有公共交点:
误区:按照左端点递增排序,再按右端点递增排序。
反例:
---------
  --
     --
选了第一个区间,后面两个都没有机会了。
正解:按右端点递增排序,再按左端点递增排序。
总结:除了第四种,都可以按左端点单增排序,然后贪心地选。
更详细地证明:https://www.cnblogs.com/acgoto/p/9824723.html

猜你喜欢

转载自www.cnblogs.com/mowanying/p/11815979.html