体检 排序 排队问题

来源:互联网 发布:vscode wordpress 编辑:程序博客网 时间:2024/05/01 02:21

NKOJ 2425 体检

时间限制 : 10000 MS 空间限制 : 165536 KB

问题描述

 开学了,学校要求你进行入学体检。你到了校医务室门口,发现有好多学生在排队,人数还在不断增加。
  有多个体检项目要做。每个项目都有很多人在排队。队伍的长度在随着时间变长。该选哪一个队伍排队呢?这成了一个问题。你要安排一下体检顺序,尽可能早的完成所有项目的体检。

输入格式

第一行一个整数n,表示要体检的项目数量 接下来n行,每行表示一个体检项目。每行两个整数a和b,描述该项目的情况:
1.如果你在第0时刻加入了这只队伍,需要等待a秒钟才能完成该项目的检查。
2.当你不在这个队伍里,随时间队伍会变得越来越长,等待的时间每秒钟会增加b秒。

输出格式

一个整数表示你完成体检最短需要花费的时间。 结果可能很大,所以请mod (365×24×60×60)再打印出结果

样例输入 1

5
1 2
2 3
3 4
4 5
5 6

样例输出 1

1419

样例输入 2

7
5 2
2 27
9 5
7 16
2 3
14 10
13 9

样例输出 2

331466

提示

【样例1说明】
你按以下次序体检.
1.在第一个队伍中花了1秒
2.在第二个队伍中花了5秒
3.在第三个队伍中花了27秒
4.在第四个队伍中花了169秒
5.在第五个队伍中花了1217秒 所以总时间是1419秒
【数据范围】
对于50%的数据有:1<=n<=1000 0<=a,b<=30000
对于100%的数据有:1<=n<=100000 0<=a,b<=50000


很久之前的题目了。由于最近做到一道感觉类似的题NKOJ4231 理发时间,所以拿出来写一写。

这道题的棘手之处在于,每一个决定都会直接影响到未来。且由于数据范围太大以及排队顺序可以不按照输入数据来(废话,按照输入数据来的话模拟即可),因此我们无法使用费用提前计算

(说这些是想到了另一道题:NKOJ1047 任务安排,这道题是费用提前计算)

正向思维遇到了障碍:我们难以从现有条件出发找到最优解。那么不妨采用反向思维:从已经找到解的假定出发,寻找最优解需要满足的条件(这点和那道题是类似的)。

分析:

显然的一个贪心,如果在之前都是最优方案的情况下,如果要选两个队伍依次排队,那么我们优选排完队后耗时较少的方案。

假定之前已经找到了最优安排方案,耗时为t,现在有两个队伍(a1,b1)和(a2,b2)。不妨设(a1,b1)较优。那么有:

b1×t+a1+(a1+t)×b2+a2<b2×t+a2+(a2+t)×b1+a1

化简后可以得到:
a1×b2<a2×b1

原创粉丝点击