题目描述
有一个演讲大厅需要我们管理,演讲者们事先定好了需要演讲的起始时
间和中止时间。我们想让演讲大厅得到最大可能的使用。我们要接受一
些预定而拒绝其他的预定,目标是使演讲者使用大厅的时间最长。假设
在某一时刻一个演讲结束,另一个演讲就可以立即开始。
你必须编写一个程序,计算大厅最大可能的使用时间。
间和中止时间。我们想让演讲大厅得到最大可能的使用。我们要接受一
些预定而拒绝其他的预定,目标是使演讲者使用大厅的时间最长。假设
在某一时刻一个演讲结束,另一个演讲就可以立即开始。
你必须编写一个程序,计算大厅最大可能的使用时间。
输入
输入文件第一行为一个整数n,n <= 10000,表示申请的数目。
接下来的n行每行包含两个整数p,k,1 <= p < k <= 30000,表示这个
申请的起始时间和中止时间。
接下来的n行每行包含两个整数p,k,1 <= p < k <= 30000,表示这个
申请的起始时间和中止时间。
输出
输出文件只有一个整数,表示大厅最大可能的使用时间。
样例输入
12
1 2
3 5
0 4
6 8
7 13
4 6
9 10
9 12
11 14
15 19
14 16
18 20
样例输出
16
#include <bits/stdc++.h> using namespace std; struct node { int p,k; }t[10000]; bool cmp(node a,node b) { return a.k<b.k; } //结束时间升序 int main() { int n;while(~scanf("%d",&n)) { int M=0; for(int i=0;i<n;i++) { scanf("%d%d",&t[i].p,&t[i].k); M=max(M,t[i].k); } sort(t,t+n,cmp); int dp[30005]; //总可用时间 memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++) { for(int j=M;j>=t[i].k;j--) //下界为结束时间 { dp[j]=max(dp[j],dp[t[i].p]+t[i].k-t[i].p); //选中则前一个选项的容量为该点开始时间 } } printf("%d\n",dp[M]); } return 0; }