C++ 会议安排(贪心算法)

描述:

学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。
小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,
他想尽可能的安排更多的活动,请问他该如何安排。


简短理解题意:在不发生冲突的情况下,一天最多可以安排多少个会议?

目标:在有限的时间内,尽可能多地安排会议。


贪心策略:

1.选最早开始的会议(缺点:会议可能结束的晚,也就是持续的时间会很长)

2.选结持续时间最短的会议(缺点:会议可能开始的很晚)

3.选择最早结束的会议


算法设计思路:
  • 1.按照会议的结束时间升序排序(也就是选择结束时间最早的)
    • 当结束时间相同时,按照开始时间降序排序 (也就是当结束时间相同时选择开始时间最晚的)
  • 2.选择第一个最早结束的会议,用变量last记录时间
  • 3.再循环判断剩下的,当 i 的开始时间大于last时,说明是不冲突的可以的,last重新赋值当前的结束时间,计数器加加
#include <iostream>
#include <iomanip>
#include <string.h>
#include <cmath>
#include <algorithm>//算法头文件
#include <fstream>
#include <cstdlib>
#include <vector>
using namespace std;

//盛放会议时间和次数的结构体 
struct Meet{
	int begin_time; //开始的时间 
	int end_time;	//结束的时间 
	int num;	//会议编号 
}meet[100];

bool compare(Meet a, Meet b){
	if(a.end_time == b.end_time){//如果结束时间相等,按照开始时间降序 
		return a.begin_time>b.begin_time;
	}
	return a.begin_time<b.begin_time;//按照开始时间升序(选择最早的时间) 
}

int main(){

	//输入会议总数
	int n;
	cout<<"请输入会议总数:"<<endl;
	cin>>n;
	
	//循环输入会议开始和结束的时间
	cout<<"请输入会议的开始时间和结束时间\n";
	for(int i=0; i<n; i++){
		cin>>meet[i].begin_time>>meet[i].end_time;
		meet[i].num = i+1;
	} 
	
	//根据时间排序
	sort(meet, meet+n, compare);
	
	//输出一下排序后的 会议时间表 
	cout<<"编号\t开始时间\t结束时间\n";
	for(int i=0; i<n; i++){
		cout<<meet[i].num<<"\t"<<meet[i].begin_time<<"\t"<<meet[i].end_time<<endl;
	}
	
	int ns = 1;//计数,从一开始是因为第一个会议最早开始肯定符合 
	int last = meet[0].end_time;	//取出第一个的结束时间
	for(int i=1; i<n; i++){
		if(meet[i].begin_time > last){//如果当前的开始时间大于上一个会议的结束时间,说明是可以的 
			ns++;
			last = meet[i].end_time; //取出每一次的结束时间 
		}
	} 
	
	cout<<"最多可以安排"<<ns<<"次会议"<<endl;
	
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

WGS.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值