问题:每个会议都有个开始时间b,和结束时间e。会议安排问题就是在有限的时间内召开最多的会议,每次只能召开一个会议,所以会议时间是不能冲突的。
贪心策略
每次从未安排的会议中选择,具有最早结束时间的会议,当然不能与已安排会议的时间冲突。
算法设计
1)将n个会议的开始时间,结束时间,会议编号放在一个结构体数组中。按结束时间从大到小排序,如果结束时间相同,按开始时间从大到小排序。
2)首先选择第一个具有最早结束时间和最早开始时间的会议,用end记录此会议结束时间。
3)选择第一个会议之后,接下下按照贪心策略选择接下来的会议。如果会议i的开始时间大于等于前一个会议的结束时间,那么此会议是可以安排的,每次选择会议后,更新end记录的时间;不满足条件的会议舍弃,继续检查下一个会议。
实例代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct Meet
{
int b; //会议开始时间
int e; //会议结束时间
int num; //会议编号
}meet[100];
bool cmp(Meet x,Meet y)
{
if(x.e==y.e)
return x.b>y.b; //结束时间相等,按开始时间从大到小排序
return x.e<y.e;
}
int main()
{
int n,sum,end;
cout<<"请输入会议总数"<<endl;
cin>>n;
cout<<"请输入各个会议开始的时间和结束时间,及会议编号"<<endl;
for(int i=0;i<n;i++)
{
cin>>meet[i].b>>meet[i].e;
meet[i].num=i++;
}
sort(meet,meet+n,cmp)
cout<<"排完序的时间如下"<<endl;
cout<<"会议编号"<<"会议开始时间"<<"会议结束时间"<<endl;
for(int i=0;i<n;i++)
{
cout<<meet[1].num<<meet[i].b<<meet[i].e<<endl;
}
cout<<"选择第"<<"meet[0].num"<<"个会议为第一个会议"<<endl;
ans=1; //记录已选择的会议个数
end=meet[0].e; //记录当前会议的结束时间
for(int i=1;i<n;i++) //从接下来的会议中选取合适的会议
{
if(meet[i].b>end) //首先满足跟前面会议时间不冲突
{
ans++; //更新会议ans和end
end=meet[i].e;
}
}
cout<<"最多可以安排"<<ans<<"个会议"<<endl;
return 0;
}