贪心算法——会场安排问题
来源:互联网 发布:linux停机命令 编辑:程序博客网 时间:2024/05/20 08:02
问题描述:
设有n个会议的集合C={1,2,…,n},其中每个会议都要求使用同一个资源(如会议室),而在同一时间内只能有一个会议使用该资源。每个会议i都有要求使用该资源的起始时间bi和结束时间ei,且bi < ei 。如果选择了会议i使用会议室,则它在半开区间[bi, ei)内占用该资源。如果[bi, ei)与[bj , ej)不相交,则称会议i与会议j是相容的。会场安排问题要求在所给的会议集合中选出最大的相容活动子集,也即尽可能地选择更多的会议来使用资源。
贪心策略:
选择最早开始时间且不与已安排会议重叠的会议
选择使用时间最短且不与已安排会议重叠的会议
选择具有最早结束时间且不与已安排会议重叠的会议
这里,我们要尽可能多的安排会议,显然采取贪最早结束时间的策略。
算法设计:
步骤1:初始化。开始时间存入数组B;结束时间存入数组E中且按照结束时间的非减序排序,B相应调整;集合A存储解,会议i如果在集合A中,当且仅当A[i]=true;
步骤2:根据贪心策略,首令A[1]=true;
步骤3:依次扫描每一个会议,如果会议i的开始时间不小于最后一个选入A中的会议的结束时间,则将会议i加入A中;否则,放弃,继续检查下一个会议与A中会议的相容性。
示例:设有11个会议等待安排,用贪心法找出满足目标要求的会议集合。这些会议按结束时间的非减序排列如表所示。
算法描述:
设会议i的起始时间bi和结束时间ei的数据类型为整形(限制在整点);则GreedySelector算法描述如下:
Void GreedySelector(int n,int b[ ],int e[ ],bool A[ ]){ e中元素按非递减序排列,b中对应元素做相应调整; int I,j; A[1]=true; //初始化选择会议的集合A,只包含会议1; j=1;i=2; //从第二(i)个会议开始寻找与会议1(j)相容的会议; while(i<=n) if(b[i]>=e[j]) {A[i]=true;j=I;} else A[i]=false;}
该算法的时间复杂度为排序的复杂度:O(nlogn),空间复杂度为常数阶:O(1)
代码实现:
#include <iostream>using namespace std;void GreedySelector(int n, int B[], int E[], bool A[]);void time(int n,int B[], int E[]);int main(){ int n; cout<<"请输入会议总数:"; cin>>n; int B[n],E[n]; bool A[n]; cout<<"请输入所有会议开始时间和结束时间:例如 1 4"<<endl; for(int i=1;i<=n;i++){ cin>>B[i]; cin>>E[i]; } for(int i=1;i<=n;i++){ A[i] = false; } time(n,B,E); GreedySelector(n,B,E,A); return 0;}void time(int n, int B[],int E[]){ int i,j,temp1,temp2; for(j=1;j<n+1;j++){ for(i=1;i<n+1-j;i++){ if(E[i]>E[i+1]){ temp1 = E[i]; E[i] = E[i+1]; E[i+1] = temp1; temp2 = B[i]; B[i] = B[i+1]; B[i+1] = temp2; } } } cout<<"按结束时间排序后的会议排列表:"<<endl; for(i=1;i<=n;i++){ cout<<i<<" "; } cout<<endl; for(i=1;i<=n;i++){ cout<<B[i]<<" "; } cout<<endl; for(i=1;i<=n;i++){ cout<<E[i]<<" "; } cout<<endl;}void GreedySelector(int n, int B[], int E[], bool A[]){ int i,j; A[1]=true; j=1;i=2; for(i=2;i<=n;i++){ if(B[i]>=E[j]){ A[i] = true; j = i; }else{ A[i] = false; } } cout<<"会议集合为{"; for(int i=1;i<=n;i++){ if(A[i]){ cout<<i<<","; } } cout<<"}"<<endl;}
阅读全文
0 0
- 贪心算法——会场安排问题
- 贪心算法——会场安排问题
- 贪心算法——NY 14 会场安排问题
- 【贪心算法】会场安排问题
- 会场安排问题 贪心算法
- 会场安排问题贪心算法
- 会场安排——贪心
- 贪心算法-会场安排
- 会场安排问题(贪心算法)
- 贪心算法解决会场安排问题
- 会场安排问题(贪心算法)
- 贪心算法之nyoj会场安排问题
- NTOJ-14-会场安排问题(贪心算法)
- 会场安排问题(贪心算法)
- 贪心算法作业之会场安排问题
- 会场安排问题之贪心算法
- 会场安排问题(贪心算法,Ruby)
- 贪心算法实现会场安排问题
- 常见JedisConnectionException异常分析
- this solve my problem perfectly
- 深度学习中的Dropout原理介绍
- day7下
- linux学习第十七篇:vim介绍,颜色显示,移动光标,复制剪切粘贴
- 贪心算法——会场安排问题
- Python的复制
- @responseBody注解的使用
- 在linux下安装php扩展时,找不到configure
- 繁花规小程序~
- 第六章 二叉树和树
- hadoop2.7.2本地调试MR IDEA本地调试mapreduce
- 龟兔赛跑
- okhttp通过拦截器输出html源码内容