ABC131D solution

Problem

link->https://atcoder.jp/contests/abc131/tasks/abc131_d

Solution

很明显,这是一道贪心

我们选择以完成期限为第一关键字,以完成时间为第二关键字进行排序

为什么呢?我们是在保证完成任务的情况尽量选择最优解,所以我们肯定要保证每一个任务首先要在完成期限内,故以完成期限为第一关键字。

可能还有人觉得这并不严谨,万一有两个任务 \(A\)\(B\),如果 \(A\) 的完成期限早,但时间长;而 \(B\) 完成期限晚,但时间长。如果以完成期限为第一关键字,那么先干 \(A\),时间较长,虽然 \(A\) 完成了任务但也导致了 \(B\) 的拖延而没办法完成该怎么办呢?

事实上,是不会出现这样子的事情。我们设 \(A\) 任务完成期限为 \(a\),时间长 \(b\)\(B\) 任务完成期限 \(c\),时间长 \(d\)\(a\le c,d\le b\))并当前时间为 \(t\)。我们需要证明如果先干 \(B\) 能完成任务,那么先干 \(A\) 也一定能完成任务。如果先干 \(B\) 能完成任务,那么也就保证 \(t+d\le c\)\(t+d+b\le a\)。有了以上条件,我们容易证明

  • \(t+b\le a\)
  • \(t+b+d\le c\)

为什么呢?首先第一点明显成立:\(t+d+b\le a\)\(d\) 为正整数,则 \(a\ge t+d+b>t+b\);第二点,\(a\le c\),既然 \(t+d+b\le a\) 那么自然也 \(t+d+b\le a\le c\)

同时容易看出,如果 \(A\)\(B\) 为相邻的任务,那么交换他们,也仅仅影响到 \(A\)\(B\) 的完成。

证毕。

综上所述,我们使用完成期限为第一关键字进行排序,我们可以考虑用 std::pair 将他们保存起来,使用 .first 代表完成期限(第一关键字),.second 为第二关键字,由于 pair 自动使用 .first 为第一关键字进行排序,所以用起来还是蛮方便的。

接下来模拟即可。

posted @ 2022-08-02 08:57  lsj2009  阅读(42)  评论(0)    收藏  举报