贪心算法之高级钟点秘书会议安排问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011068702/article/details/79042481

1、问题

所谓“钟点秘书”,是指年轻白领女性利用工余时间为客户提供秘书服务,并按钟点收取酬金。“钟点秘书”为客户提供有偿服务的方式一般是:采用电话、电传、上网等“遥控”式服务,或亲自到客户公司处理部分业务。其服务对象主要有三类:一是外地前来考察商务经营、项目投资的商人或政要人员,他们由于初来乍到,急需有经验和熟悉本地情况的秘书帮忙;二是前来开展短暂商务活动,或召开小型资讯发布会的国外客商;三是本地一些请不起长期秘书的企、事业单位。这些客户普遍认为:请“钟点秘书”,一则可免去专门租楼请人的大笔开销;二则可根据开展的商务活动请有某方面专长的可用人才;三则由于对方是临时雇用关系,工作效率往往比固定的秘书更高。据调查,在上海“钟点秘书”的行情日趋看好。对此,业内人士认为:为了便于管理,各大城市有必要组建若干家“钟点秘书服务公司”,通过会员制的形式,为众多客户提供规范、优良、全面的服务,这也是建设国际化大都市所必需的。某跨国公司总裁正分身无术,为一大堆会议时间表焦头烂额,希望高级钟点秘书能做出合理的安排,能在有限的时间内召开更多的会议。

简而言之:最之间段内开最多的会议,但是会议和会议之间不能相交


2、分析

两个会议之间不能相交,不能有交集。

贪心策略:每次从剩下的会议中选择具有最早结束时间且与已安排的会议相容的会议安排

也就是说我们先把会议的结束时间从小到大排序,然后再每次从会议的结束时间和后面没有安排的会议进行安排,但是不能和后面的会议相交。




3、代码实现


#include <iostream>
#include <algorithm>

using namespace std;

const int size = 1000;

struct Meet
{
	//会议开始时间
	int startTime;
	//会议结束时间
	int endTime;
	//会议的序号
	int num; 
}data[size];

//按照结束时间从小到大排列
bool compare(struct Meet m1, struct Meet m2)
{
	if (m1.endTime == m2.endTime)
		return m1.startTime > m2.startTime;
	else
		return m1.endTime < m2.endTime;
}

class setMeet
{
public:
	void init();
	void resolve();
private:
    //会议的个数和最多安排的次数
	int all, count; 
};

void setMeet::init()
{
	std::cout << "请输入会议的个数" << std::endl;	
	std::cin >> all;
	if (all <= 0) 
	{
		std::cout << "您输入的数据有误" << std::endl;
	}
	std::cout << "您输入的会议个数为" << all << std::endl;
	std::cout << "请输入会议的开始时间和结束时间" << std::endl;
	for (int i = 0; i < all; ++i)	
	{
		std::cin >> data[i].startTime >> data[i].endTime;
		data[i].num = i + 1;
	}
}

void setMeet::resolve()
{
	//对会议进行排序
	sort(data, data + all, compare);
	std::cout << "排序后的所有数据" << std::endl;
	std::cout << "会议的序号" << "\t" << "会议的开始时间" << "\t" << "会议的结束时间" << std::endl;
	for (int i = 0; i < all; ++i)
	{
		std::cout << data[i].num << "\t" << data[i].startTime << "\t" << data[i].endTime << std::endl;	
	}
	//记录排序后的第一次会议结束时间
	int lastTime = data[0].endTime;
	count = 1;
	std::cout << "您选择了第" << data[0].num << "会议" << std::endl;
	for (int i = 1; i < all; ++i)
	{
		/**
		if (data[i].startTime < lastTime) 
		{
			continue;	
		}
		else 
		{
			count++;
			lastTime = data[i].endTime;
			std::cout << "您选择了第" << data[i].num << "会议" << std::endl;
		}
		**/
	    //当然我们这样写更好,代码行数减少了,而且看起来没那么别扭
		if (data[i].startTime >= lastTime)
		{
			count++;
			lastTime = data[i].endTime;
			std::cout << "您选择了第" << data[i].num << "会议" << std::endl;
		}
	}
	std::cout << "一共可以开" << count << "个会议" << std::endl;
}


int main()
{
	setMeet meet;
	meet.init();
	meet.resolve();
	return 0;	
}





4、运行结果

请输入会议的个数
5
您输入的会议个数为5
请输入会议的开始时间和结束时间
1 4
2 6
34
98
4 7
2 9
排序后的所有数据
会议的序号	会议的开始时间	会议的结束时间
1	1	4
2	2	6
4	4	7
5	2	9
3	34	98
您选择了第1会议
您选择了第4会议
您选择了第3会议
一共可以开3个会议




5、总结

找到贪心策略是解决问题的关键




没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试