C++小练习—会场安排

来源:互联网 发布:英国大学申请 知乎 编辑:程序博客网 时间:2024/06/08 09:50

1、问题描述

设有n个会议,需要使用同一个资源(如会议室),同一时间内该会议室只能被一个会议占用。每个会议i都有要求使用该资源的起始时间s和结束时间e,且s<e。如果选择了会议i使用会议室,则它在半开区间[si,ei)内占用该资源。如果[si,ei)[sj , ej)不相交,则称会议i与会议j是相容的。会场安排问题要求在所给的会议集合中选出最大的相容活动子集,也就是可以尽可能多的选择会议来使用会议室。

2、算法设计
1)贪心算法的解题步骤
a、
分解:将原问题分解为若干个相互独立的阶段。
b、
解决:对于每个阶段依据贪心策略进行贪心选择,求出局部的最优解。
c、
合并:将各个阶段的解合并为原问题的一个可行解。影响时间复杂性的因素
2)针对该问题的贪心策略
a、
选择最早开始时间且不与已安排会议重叠的会议
b、
选择使用时间最短且不与已安排会议重叠的会议
c、
选择具有最早结束时间且不与已安排会议重叠的会议
但是由推倒可知,只有按最早结束时间才能获得我们想要的结果。
3)算法设计步骤
步骤
1:初始化。定义结构体用来存储会议的起始时间s和结束时间e。采用容器来存储该结构体节点,并用sort函数对其按照结束时间的非减序排序;
步骤2:根据贪心策略,进行判断
步骤3:依次扫描每一个会议,如果会议i的开始时间不小于最后一个选入A中的会议的结束时间,则打印会议i的编号;否则,放弃,继续检查下一个会议与A中会议的相容性。

3、代码

#include<iostream>#include<algorithm>#include<vector>using namespace std;typedef struct node{   int s;   int e;   int number;}Node;//采用结构体来存储会议信息vector<Node> v;bool compare(Node a,Node b){return a.e<b.e;}void MeetArra(){int CurrTime=0;sort(v.begin(),v.end(),compare);//按照结束时间进行排序for(auto it=v.begin();it!=v.end();++it){if(it->s>=CurrTime){cout<<it->number<<" ";CurrTime=it->e;}}}int main(){int i,n,k=1;cout<<"请输入总会议数:";cin>>n;Node t;for(i=1;i<=n;++i){t.number=k;//用于给会议编号,方便输出k++;cout<<"输入起始时间:";cin>>t.s;cout<<"输入结束时间:";cin>>t.e;v.push_back(t);}MeetArra();system("pause");return 1;}

0 0