【動態規劃】大廳安排 (ssl 1212)
阿新 • • 發佈:2018-12-22
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]);//輸出
}