【学习时间】2021/3/14
【题目名称】会议安排
(1)对于每个会议i,起始时间bi和结束时间ei,且bi<ei
(2)[bi,ei)与[bj,ej)不相交,则会议i和会议j相容,bi≥ej或bj≥ei
目标:在有限的时间内,尽可能多地安排会议。
【贪心策略】
(1)选最早开始的会议 (缺点:会议可能持续时间长)
(2)选持续时间最短的会议(缺点:会议可能开始地晚)
(3)选择最早结束的会议
【解决过程】
(1)初始化:按结束时间非递减排序,若结束时间相等,则按开始时间非递增排序。
(2)选中第一个具有最早结束时间的会议,用last记录时间。
(3)挑剩下的,若i的开始时间>last,则与会议i与已挑会议相容。
【C++知识扩展——sort()的自定义函数】
C++ STL的sort 函数 以及自定义的比较函数
【源代码】
//贪心算法——会议安排
/*
测试用例:
10
3 6
1 4
5 7
2 5
5 9
3 8
8 11
6 10
8 12
12 14
*/
#include <iostream>
#include <algorithm>
using namespace std;
struct Meet
{
int start;
int end;
int num;
};
Meet meet[100];
int last_pos;
int n;
bool cmp(Meet x,Meet y)
{
if(x.end==y.end)return x.start>y.start;
return x.end<y.end;
}
void Arrange(int e)
{
for(int i=last_pos;i<=n;i++)
{
if(meet[i].start>e)
{
last_pos=i;
cout<<meet[i].num<<"号会议"<<endl;
return Arrange(meet[i].end);
}
}
}
int main()
{
cout<<"输入会议总数:";
cin>>n;
cout<<"输入会议开始时间、结束时间:"<<endl;
for(int i=1;i<=n;i++)
{
meet[i].num=i;
cin>>meet[i].start;
cin>>meet[i].end;
}
sort(meet,meet+n,cmp);
cout<<"安排会议按时间依次如下:"<<endl;
last_pos=1;
Arrange(0);
return 0;
}