【动态规划】大厅安排 (ssl 1212)

大 厅 安 排 大厅安排

Description

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

计算演讲大厅最大可能的使用时间。

Input

第一行为一个整数n,n <= 100,表示申请的数目。

Output

一个整数,表示大厅最大可能的使用时间。

Sample Input

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

Sample Output

16

题目大意:

有n个人打算在ai至bi时开一个演讲,但只有一个场地,要使演讲时间最长,不能分开

解题方法:

先用结束时间排序,再看一看此人演讲的结果好,还是不演讲好(具体在代码里面讲)

#include
#include
#include
using namespace std;
int n,f[10005];
struct rec
{
	int x,y;
}a[105];
bool rep(rec xx,rec yy)
{
	return ((xx.y<yy.y)||((xx.y==yy.y)&&(xx.x<yy.x)));//按结束时间从小到大排序,如果相同,再按开始时间从小到大排序
}
int main()
{
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
	  scanf("%d%d",&a[i].x,&a[i].y);//输入
	sort(a+1,a+1+n,rep);//排序
	for (int i=1;i<=n;i++)//第i个人
	  for (int j=a[i].y;j<=a[n].y;j++)//只有时间大于a[i].y才能让这个人讲,小于的无法排
	    f[j]=max(f[a[i].x]+a[i].y-a[i].x,f[j]);//前面的是开始前加上这段时间,后面的是原数
	printf("%d",f[a[n].y]);//输出
}

你可能感兴趣的:(DP)