2025.12.13 作业 - # P2920 [USACO08NOV] Time Management S
题目描述
作为一名忙碌的商人,约翰知道必须高效地安排他的时间。他有 \(N(1\le N\le 1000)\) 个工作要做,比如给奶牛挤奶,清洗牛棚,修理栅栏之类的。
为了高效,约翰列出了所有工作的清单。第 \(i(1\le i\le N)\) 个工作需要 \(T_i(1\le T_i\le 1000)\) 单位的时间来完成,而且必须在 \(1\le S_i\le 10^6\) 或之前完成。现在是 \(0\) 时刻。约翰做一份工作必须直到做完才能停止。
所有的商人都喜欢睡懒觉。请帮约翰计算他最迟什么时候开始工作,可以让所有工作按时完成。(如果始终无法完成全部任务,输出 -1)
输入格式
第一行,一个整数 \(N\)
接下来 \(N\) 行,每行 \(2\) 个有空格分隔的整数 \(T_i,S_i\)
输出格式
一行,一个整数,表示约翰可以开始工作的最晚时间,如果约翰无法完成所有工作,则为 -1
输入输出样例 #1
输入 #1
4
3 5
8 14
5 20
1 16
输出 #1
2
说明/提示
【样例解释】
约翰有 \(4\) 个工作要做,分别需要 \(3、8、5\) 和 \(1\) 个时间单位,并且必须分别在时间 \(5、14、20\) 和 \(16\) 之前完成。
约翰必须在时间 \(2\) 开始第一个作业。然后他可以按此顺序完成第二、第四和第三项工作,以按时完成。
#include<bits/stdc++.h>
using namespace std;
int n;
struct node{
int Len,Ed;
}s[1001];
bool cmp(node &t1,node &t2) {
return t1.Ed>t2.Ed;
}
int main() {
cin>>n;
for (int i=1;i<=n;i++) cin>>s[i].Len>>s[i].Ed;
sort(s+1,s+1+n,cmp);
int st=s[1].Ed-s[1].Len;
for (int i=2;i<=n;i++) {
st=min(st,s[i].Ed)-s[i].Len;
}
if (st<0)cout<<-1<<endl;else cout<<st<<endl;
return 0;
}
浙公网安备 33010602011771号