贪心:区间问题

10 分钟

给一堆有开始和结束时间的活动,选出最多的互不重叠的活动——这是最经典的贪心。策略是:按结束时间从小到大排序,然后从前往后扫,只要当前活动的开始时间不早于上一个选中活动的结束时间,就选它。

sort(a, a + n, [](Node x, Node y){ return x.end < y.end; });
int cnt = 0, lastEnd = -1;
for (int i = 0; i < n; i++)
    if (a[i].start >= lastEnd) {   // 不冲突
        cnt++;
        lastEnd = a[i].end;
    }

为什么按结束时间排、而不是按长度或开始时间?因为结束得越早,给后面留的空间越多,是"最不占地方"的选择。可以用交换论证严格证明:任何最优解都能替换成先选最早结束的那个,答案不会变差。

复杂度瓶颈在排序,。坑:判重叠时端点相接(一个的结束正好是另一个的开始)算不算冲突,要看题目定义,是用 >= 还是 >

小纸条

为什么按结束时间而不是长度排?

登录 后可看答案

贪心:区间问题 · 考级冲刺 · op599 课程