【01背包】 演讲大厅安排 HUSTOJ3222

题目描述

有一个演讲大厅需要我们管理,演讲者们事先定好了需要演讲的起始时
间和中止时间。我们想让演讲大厅得到最大可能的使用。我们要接受一
些预定而拒绝其他的预定,目标是使演讲者使用大厅的时间最长。假设
在某一时刻一个演讲结束,另一个演讲就可以立即开始。
你必须编写一个程序,计算大厅最大可能的使用时间。

输入

输入文件第一行为一个整数n,n <= 10000,表示申请的数目。
接下来的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;
}


猜你喜欢

转载自blog.csdn.net/ummmmm/article/details/80200872