一读题,发现与贪心中的任务调度有点类似。保证答案大于等于零,言外之意即为所有任务都可以在合法时间内完成。那么只要按照任务调度的思路做就行了:
用结构体(方便sort)数组t读入所有ai、bi后按照结束时间从大到小排序。设ans为答案,i为当前要处理的任务在排序后的编号。ans初始为t[1].b,i=1,2,…,n。
对于每个i:1、若ans比第i号任务的截止时间晚,则让ans等于该任务的截止时间;
2、ans-=第i号任务的耗时。
最后ans的值即为答案。
AC代码:
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 #include<cctype>
6 using namespace std;
7 struct tong{
8 int a,b;
9 }t[1000001];
10 int ans;
11 char ch;
12 inline int read()
13 {
14 ans=0;
15 ch=getchar();
16 while(!isdigit(ch))
17 ch=getchar();
18 while(isdigit(ch)) ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
19 return ans;
20 }
21 inline bool cmp(tong a,tong b)
22 {
23 return a.b>b.b;
24 }
25 int main()
26 {
27 int n;
28 n=read();
29 for(register int i=1;i<=n;i++)
30 {
31 t[i].a=read();t[i].b=read();
32 }
33 sort(t+1,t+n+1,cmp);
34 ans=t[1].b;
35 for(register int i=1;i<=n;i++)
36 {
37 if(ans>t[i].b) ans=t[i].b;
38 ans-=t[i].a;
39 }
40 printf("%d",ans);
41 return 0;
42 }