2021/3/14 算法入门——贪心算法之会议安排问题

【学习时间】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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yozu_Roo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值