题意简述
你有 $n$ 项工作要做,第 $i$ 项工作需要连续的 $d_i$ 天去完成(同一天只能完成一项工作),而且最后一天不得晚于 $t_i$。问在开始所有工作之前,你最多能休息多久?
数据范围:$1\le n\le 10^6$,$1\le d_i,t_i\le 10^9$。保证所有任务都能够按时完成。
解析
简单的贪心。
秉承“能拖就拖”的原则,我们先按截止时间降序排列这些任务,然后从前往后扫,同时维护一个值 $Ans$(根据数据范围,该值初始值应不小于 $10^9$)。
对于每个 $i$,执行下面这个式子:
$$Ans\leftarrow\min(Ans,t_i)-d_i$$
为什么?
首先第 $i$ 项工作需要在第 $t_i$ 天及之前完成,所以开始时间肯定不晚于 $t_i-d_i+1$。
如果即便拖延到极致但有工作已经占了第 $t_i$ 天,那么只能再往前推,推到最后一个没有工作的日子为止(第 $Ans$ 天)。
最后直接输出 $Ans$ 就可以了。
快排时间复杂度 $\mathcal{O}(n\log n)$,扫任务时间复杂度 $\mathcal{O}(n)$,可以通过本题。
代码实现过程已在上文中完整给出,因此不展示。
感谢您的阅读!