问题描述:
假如你是一位临时秘书,需要为一位IT总裁在一天之内尽可能多的安排会议。并且时间不能够冲突。这里给出当天所有会议的开始时间和结束时间。很显然如果两个会议要连续进行的话,当前会议的结束时间要早与下一个会议的开始时间。算法开始之前简要介绍下贪心算法的主要精神!!!
贪心算法简要介绍
一个贪心算法总是做出当前最好的选择,也就是说,他期望通过局部最优选择从而得到全局最优的解决方案
—算法导论
根据上面提出,贪心算法最重要的就是做出当前做好的选择。也就是我们常说的“活在当下”,只要把当下的每一天过好就OK啦。回到算法的本质是我们通过局部最优解的形式不断逼近全局最优解。
当时针对不同的目的,我们会有不同的贪心策略。比如你要在苹果堆中挑出一个最好的苹果。可以采用每一次都挑选最大的苹果,也可以采用每一次挑选最红的苹果等等。
三种不同的贪心策略
- 策略一,每次从剩下的会议中选择最早开始的会议且与已安排的会议不冲突,增大时间资源的利用率。
- 策略二,每次从剩下的会议中选择持续时间最短且与已安排的会议不冲突,这样可以尽快安排更多的会议。
- 策略三,每一次从剩下的会议中选择结束时间最短且与已安排的会议不冲突,这样可以尽快安排下一场会议。
我们如果选择最早开始的会议,假如持续时间很长的话则达不到最多会议的效果。如果我们选择持续时间最短,但是如果开始的时间很晚的话,比如晚上八点才开始会议也达不到安排最多会议的效果。最早结束时间能够兼顾最早开始时间和持续时间最短。因此我们选择策略三
代码分析
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
//动态规划之会议安排
//会议的结构体
struct Meet
{
int beg;//开始时间
int end;//结束时间
int num;//会议的编号
}meet[1000];
//setMeet类
class setMeet {
public:
void init();
void solve();
private:
int total, max_num;//会议的总数量,一天安排的最大会议数量
};
//setMeet init方法
void setMeet::init()
//sort函数比对策略
{
int s, e;//开始和结束时间
cout << "输入会议总数:" << endl;
cin >> total;
cout << "输入会议的开始和结束时间,中间使用空格隔开" << endl;
for (size_t i = 0; i < total; i++)
{
cin >> s >> e;
meet[i].beg = s;
meet[i].end = e;
meet[i].num = i + 1;//会议编号从1开始
}
}
bool cmp(Meet x, Meet y)
{
if (x.end == y.end)
{
return x.beg > y.beg;
}
return x.end < y.end;
}
//setMeet solve方法,贪心算法求解
void setMeet::solve()
{
sort(meet, meet + total, cmp);
cout << "排完序的会议时间如下" << endl;
cout << "会议编号" << "开始时间" << "结束时间" << endl;
for (size_t i = 0; i < total; i++)
{
cout << " " << meet[i].num << "\t" << meet[i].beg << "\t" << meet[i].end << endl;
}
cout << "--------------------------------------" << endl;
cout << "选择会议的过程:" << endl;
cout << "选择第" << meet[0].num << "个会议" << endl;
max_num = 1;
int last = meet[0].end;//记录刚刚选中会议的结束时间
for (size_t i = 0; i < total; i++)
{
if (meet[i].beg >= last)//会议开始时间与上一个会议的结束时间不冲突
{
max_num += 1;
last = meet[i].end;
cout << "选中第" << meet[i].num << "个会议" << endl;
}
}
cout << "最多可以选择" << max_num << "个会议" << endl;
}
//main函数
int main()
{
setMeet sm;
sm.init();
sm.solve();
return 0;
}