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


第一次c++实战
1<=i<=n
1<=j< i
在第二个循环中找出比第i个早结束的最大使用时间,也就是 if(p[i].a>=p[j].b&&m< dp[j]) m=dp[j];
再将dp[i]的值改变为p[i].b-p[i].a+m
最后找到最大使用时间


代码如下:

#include<cstdio>  
#include<algorithm>  
#include<cstring>  
using namespace std;  
struct node  
{  
    int a,b;  
}p[5001];  
int dp[5001];    
bool cmp(node x,node y)  
{  
    if(x.b!=y.b) return x.b<y.b;  
    else return x.a<y.a;  
}  
int main()  
{  
    int n,i,j,ans,m;  
    while(scanf("%d",&n)!=EOF)  
    {  
        for(i=0;i<n;i++)  
            scanf("%d%d",&p[i].a,&p[i].b);  
        sort(p,p+n,cmp);  
        memset(dp,0,sizeof(dp));  
        ans=-1;  
        for(i=0;i<n;i++)  
        {  
            m=0;  
            for(j=0;j<i;j++)  
            {    
                if(p[i].a>=p[j].b&&m<dp[j])    
                    m=dp[j];  
            }  
            dp[i]=p[i].b-p[i].a+m;  
            if(dp[i]>ans) ans=dp[i]; 
        }  
        printf("%d
",ans);  
    }  
    return 0;  
}
原文地址:https://www.cnblogs.com/Comfortable/p/8412387.html