您的位置:首页 > 其它

欢迎使用CSDN-markdown编辑器

2017-09-23 07:28 183 查看
题目描述

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

编程任务,计算演讲大厅最大可能的使用时间。

输入

输入有多组数据,每组数据第1行为一个整数N,N<=5000,表示申请的数目。

以下n行每行包含两个整数p,k,1<=p

#include<cstdio>
#include<algorithm>
using namespace std;
int n,s,ends,sta;
struct vrb
{
int st,ed;
//st:开始时间,ed:结束时间
}a[5001];
bool cmp(vrb a,vrb b)
{
if(a.st==b.st) return a.ed<b.ed;
return a.st<b.st;
}
int main()
{
scanf("%d",&n);

for(int i=1;i<=n;++i)
scanf("%d%d",&a[i].st,&a[i].ed);
sort(a+1,a+n+1,cmp);
sta=a[1].st;
ends=a[1].ed;
//ends存储上个演讲结束时间,sta存储上个演讲开始时间
for(int i=2;i<=n;++i)
{
if(a[i].st>=ends)
{
s+=a[i].ed-a[i].st;
for(int j=i-1;j>=1;--j)
//逆序枚举最优情况
{
if(a[j].st==sta&&a[j].ed>ends&&a[i].st>=a[j].ed)
//如果两个演讲开始时间相同并且存在一个允许a[i]存在的ed>上个结束时间的a[j]就把a[j]和上个选择的替换
{
s+=a[j].ed-ends;
//更新sum
break;
}
if(a[j].st<sta) break;
}
ends=a[i].ed;
sta=a[i].st;
}
else
{
if(a[i].ed-a[i].st>ends-sta)
//如果与之前的有交叉部分并且该项演讲时间比前面的长就替换
{
s-=ends-sta;
s+=a[i].ed-a[i].st;
//更新结束时间
sta=a[i].st;
//更新开始时间
}
}
}
printf("%d",s);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: