欢迎使用CSDN-markdown编辑器
2017-09-23 07:28
183 查看
题目描述
有一个演讲大厅需要我们管理,演讲者们事先定好了需要演讲的起始时间和中止时间。我们想让演讲大厅得到最大可能的使用。我们要接受一些预定而拒绝其他的预定,目标是使演讲者使用大厅的时间最长。假设在某一时刻一个演讲结束,另一个演讲就可以立即开始。
编程任务,计算演讲大厅最大可能的使用时间。
输入
输入有多组数据,每组数据第1行为一个整数N,N<=5000,表示申请的数目。
以下n行每行包含两个整数p,k,1<=p
有一个演讲大厅需要我们管理,演讲者们事先定好了需要演讲的起始时间和中止时间。我们想让演讲大厅得到最大可能的使用。我们要接受一些预定而拒绝其他的预定,目标是使演讲者使用大厅的时间最长。假设在某一时刻一个演讲结束,另一个演讲就可以立即开始。
编程任务,计算演讲大厅最大可能的使用时间。
输入
输入有多组数据,每组数据第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; }
相关文章推荐
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器 (1)
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器