贪心算法-会议安排问题

问题:每个会议都有个开始时间b,和结束时间e。会议安排问题就是在有限的时间内召开最多的会议,每次只能召开一个会议,所以会议时间是不能冲突的。

贪心策略
每次从未安排的会议中选择,具有最早结束时间的会议,当然不能与已安排会议的时间冲突。
算法设计
1)将n个会议的开始时间,结束时间,会议编号放在一个结构体数组中。按结束时间从大到小排序,如果结束时间相同,按开始时间从大到小排序。
2)首先选择第一个具有最早结束时间和最早开始时间的会议,用end记录此会议结束时间。
3)选择第一个会议之后,接下下按照贪心策略选择接下来的会议。如果会议i的开始时间大于等于前一个会议的结束时间,那么此会议是可以安排的,每次选择会议后,更新end记录的时间;不满足条件的会议舍弃,继续检查下一个会议。
实例代码

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct Meet
{
	int b;                                                //会议开始时间
	int e;                                                //会议结束时间
	int num;                                              //会议编号
}meet[100];

bool cmp(Meet x,Meet y)
{
	if(x.e==y.e)
	return  x.b>y.b;                                 //结束时间相等,按开始时间从大到小排序
	return x.e<y.e;

}

int main()
{
 	int n,sum,end;
 	cout<<"请输入会议总数"<<endl;
 	cin>>n;
 	cout<<"请输入各个会议开始的时间和结束时间,及会议编号"<<endl;
 	for(int i=0;i<n;i++)
 		{
 		cin>>meet[i].b>>meet[i].e;
 		meet[i].num=i++;
		}
    sort(meet,meet+n,cmp)
    cout<<"排完序的时间如下"<<endl;
    cout<<"会议编号"<<"会议开始时间"<<"会议结束时间"<<endl;
    for(int i=0;i<n;i++)
	    {
        cout<<meet[1].num<<meet[i].b<<meet[i].e<<endl;
		}
	cout<<"选择第"<<"meet[0].num"<<"个会议为第一个会议"<<endl;
	ans=1;                                          //记录已选择的会议个数
	end=meet[0].e;                            //记录当前会议的结束时间
	for(int i=1;i<n;i++)                       //从接下来的会议中选取合适的会议
	{
    if(meet[i].b>end)                         //首先满足跟前面会议时间不冲突                  
    	{
    	ans++;                                    //更新会议ans和end
		end=meet[i].e;
    	}
	}
	cout<<"最多可以安排"<<ans<<"个会议"<<endl;
	return 0;
}




  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值