#22. 最大不相交区间数量
最大不相交区间数量
给定 个闭区间 ,请你在数轴上选择若干区间,使得选中的区间之间互不相交(包括端点)。
输出可选取区间的最大数量。
输入格式
第一行包含整数 ,表示区间数。
接下来 行,每行包含两个整数 ,表示一个区间的两个端点。
输出格式
输出一个整数,表示可选取区间的最大数量。
数据范围
,
输入样例:
3
-1 1
2 4
3 5
输出样例:
2
下面按 k=1..25 逐组说明这套“最多选取互不相交区间(端点也算相交)”数据分别在卡哪些常见错误做法。
(正确贪心:按右端点升序排序,能选则选;判定条件是 a > last_end,注意不是 >=。)
- 样例:基础正确性(有重叠也有可选的)。
- 单点区间
[0,0]:卡边界/初始化(别输出 0)。 - 全都互相重叠(嵌套):答案应为 1;卡把“尽量多选”写成乱选/没用贪心。
- 完全不相交(点区间):答案=N;卡误判不相交、或覆盖条件写错导致少选。
- 端点相接不可同时选
[1,2]与[2,3]:专卡把条件写成a >= last_end(会错误认为可以同时选)。 - 端点相接链
(1,2)(2,3)(3,4)(4,5)(5,6):最优应选 3 个(隔一个选一个);卡端点规则/选择策略错误。 - 大量重复同一区间:答案 1;卡重复计数(可能错误输出 20)。
- 大区间+多个互不相交小区间+远处区间:应倾向选多个小区间而不是选大区间;卡“选最长/选最早开始”等错误贪心。
- 负数段 + 混合(含嵌套/独立):卡负数比较/排序错误。
- 乱序输入 + 重叠/端点相接混合:必须排序;卡按输入顺序选。
- 专卡错误策略:先选大区间/按长度/按左端点
(1,10),(2,3),(4,5),(6,7):正确应选 3 个小的;若先选(1,10)会只得到 1。 - 专卡“按左端点排序然后贪心选”
(1,2),(3,4),(0,10):正确是选两个小的=2;左端点贪心可能先拿(0,10)变成 1。 - 相同右端点/点区间混合:考察 tie 处理 + 端点相交规则;卡排序 tie 写错或选取判断混乱(尤其把
[3,3]当成可与[1,3]共存的错误)。 - 专卡
>=错误(端点相交算冲突)(1,1)和(1,2):若先选(1,1),后者起点=1 与 last_end=1 相接,不能再选;答案 1。用>=会错选成 2。 - 点区间插在端点上
(1,2),(2,2),(3,3):(1,2)与(2,2)冲突;最优是选(2,2)和(3,3)共 2;卡把点区间当“可贴边”。 - 极值点区间(-1e9 等):卡比较/排序溢出、以及边界处理。
- 超大区间跨越全部 vs 多个小区间:正确应选多个小区间(而不是选跨越全部的大区间);卡“选覆盖范围最大”这种错贪心。
- 大量点区间 + 重复 + 端点相同:卡对重复/点区间的处理、以及端点冲突判断。
- 小规模随机(含负数):综合正确性(各种重叠/嵌套/点区间组合)。
- N=1000:100 组“组内互相重叠、组间完全分离”:答案应为 100;卡错误贪心/排序问题导致偏离。
- N=100000:全不相交点区间:答案 100000;强卡性能(O(N^2) 会炸)与 I/O。
- N=100000:全相同大区间:答案 1;强卡性能 + 重复处理。
- N=100000:连续端点相接链
[i,i+1]:最优约 50000;强卡端点规则(若误用>=会得到 100000)。 - N=100000:随机大范围短区间:综合强测(排序+贪心正确性与性能)。
- 专卡比较器用减法导致 32 位溢出(极值组合 + 超大区间 + 点区间):若比较函数写
return r1-r2等可能溢出,排序乱掉从而选取数量错误。
如果你希望我也像前几题那样“再补一份专门针对某类错误代码”的小包(比如:只卡 >=、只卡按左端点排序、只卡长度贪心),告诉我你最担心的错误写法,我可以加更尖锐的反例。