Problem A: 时间管理

Problem A: 时间管理

[Creator : ]
Time Limit : 1.000 sec  Memory Limit : 128 MB

SubmitProblemList

Description

【题目描述】
小 A 有 n 份工作需要完成,比如写作业、做奥数题、写程序。他把自己要完成的所有工作列了一个清单:第 i 份工作需要 Ti 的时间才能做完,并且必须不晚于 Si 时刻完成(正好在 Si 时刻做完也算按时)。
小 A 还没有学会多线程工作,所以他在同一时间只能做一份工作;而且一份工作一旦开始,就必须连续做完才能开始下一份工作。
请你帮小 A 算一算:他最晚从哪一时刻开始工作,才能按照要求完成全部工作?如果无论从哪一时刻开始都做不完,输出 -1。
工作的先后顺序可以任意安排,时刻 0 之前不能开始工作。
 
【输入格式】
第一行一个正整数 n(1 ≤ n ≤ 1000),表示工作的数量。
接下来 n 行,每行两个正整数 Ti 和 Si(1 ≤ Ti, Si ≤ 109),表示第 i 份工作需要 Ti 的时间,并且必须在 Si 时刻之前完成。
 
【输出格式】
一行一个整数:如果所有工作都能按时完成,输出最晚开始工作的时刻(非负整数);否则输出 -1。
 
【样例输入】
4
3 5
8 14
5 20
1 16
【样例输出】
2
 
【样例说明】
小 A 有 4 份工作,他最晚从时刻 2 开始工作,按照 1、2、4、3 的顺序执行:
  • 工作 1:2 → 5,5 ≤ 5,按时;
  • 工作 2:5 → 13,13 ≤ 14,按时;
  • 工作 4:13 → 14,14 ≤ 16,按时;
  • 工作 3:14 → 19,19 ≤ 20,按时。
如果从时刻 3 开始,工作 1 要到时刻 6 才结束,已经超过它的截止时刻 5,所以答案不能更大。
 
【数据范围】
  • 对于 40% 的数据,1 ≤ n ≤ 8;
  • 对于 100% 的数据,1 ≤ n ≤ 1000,1 ≤ Ti, Si ≤ 109。
 
【提示】
想一想:如果截止时刻越早的工作应该越早做,那么把所有工作按 S 从小到大排好序之后,从最后一件事开始往前倒推,会发生什么?
 
【来源】
2022 年慈溪市程序设计竞赛(初赛)完善程序第 1 题,改编为编程题。

Input

第一行一个正整数 n(1 ≤ n ≤ 1000),表示工作的数量。
接下来 n 行,每行两个正整数 Ti 和 Si(1 ≤ Ti, Si ≤ 109),表示第 i 份工作需要 Ti 的时间,并且必须在 Si 时刻之前完成。

Output

一行一个整数:如果所有工作都能按时完成,输出最晚开始工作的时刻;否则输出 -1。

Sample Input Copy

4
3 5
8 14
5 20
1 16

Sample Output Copy

2

HINT

先把工作按截止时刻 S 从小到大排序,再从最后一件工作往前倒推,维护一个「第 i 到第 n 份工作最晚必须在此刻之前全部做完」的时刻。