1. 程式人生 > >【動態規劃】大廳安排 (ssl 1212)

【動態規劃】大廳安排 (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<cstdio>
#include<iostream>
#include<algorithm>
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]);//輸出 }