贪心算法之秘书安排会议

问题描述:

假如你是一位临时秘书,需要为一位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;
}

运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42662358/article/details/99656614