会议问题贪心

n个会议,不同开始时间,结束时间,求一天最多能参加的会议数量是多少
贪心策略:选择结束时间最快的会议参加,在结束时间相等的前提条件下选择开始时间最大的会议=>选择会议时长最短的参加。

#include<iostream>
#include<algorithm>
const int maxnum = 100;
using namespace std;
struct Meet {
	int beg;
	int end;
}meet[maxnum];
bool cmp(Meet m1, Meet m2)
{
	if (m1.end == m2.end)
		return m1.beg > m2.beg;
	return m1.end < m2.end;
} //从大到小
int main() 
{
	int n; //会议总数
	cout << "输入总共的会议数量:" << endl;
	cin >> n;
	cout << "分别输入会议的开始时间和结束时间:" << endl;
	for (int i = 0; i < n; i++)
	{
		cin >> meet[i].beg >> meet[i].end;
	}
	sort(meet, meet + n, cmp); //第一个元素 第二个元素 比较函数
	int last = meet[0].end; //选择第一个会议
	int num = 1; //最大能参加的会议数量
	for (int i = 1; i < n; i++)
	{
		if (meet[i].beg >= last)
		{
			last = meet[i].end;
			num++;
		}
	}
	cout << "最多能参加的会议数量为:" << num << endl;
	return 0;
}

测试
10
3 6
1 4
5 7
2 5
5 9
3 8
8 11
6 10
8 12
12 14

### 使用贪心法解决会议安排调度问题 #### 问题描述 会议安排问题是任务调度的一种特殊情况,目标是在给定多个会议的情况下,尽可能多地安排不重叠的会议。每个会议有一个开始时间结束时间。 为了最大化可以参加的会议数量,可以通过贪心法来解决问题。核心思想是从所有可用会议中选择最早结束的那个会议,并将其加入到已选会议列表中,然后移除与其冲突的所有其他会议,重复此过程直到没有更多会议可以选择为止[^4]。 #### 法设计 1. 将所有的会议按其结束时间升序排列。 2. 初始化一个空集合用于存储被选定的会议。 3. 遍历排序后的会议列表,在每一步都选取当前最早的未处理会议并标记为已被选择。 4. 对于每一个新选出的会议,排除掉任何与之发生时间冲突的后续会议(即那些在其之前已经开始但在它之后才结束会议)。 5. 继续上述操作直至遍历完整个会议列表。 这种方法能够有效地找到一组互不冲突的最大数目会议组合,尽管不一定能获得绝对最优解,但对于大多数实际应用场景来说已经足够好[^3]。 #### C++ 实现示例 下面给出一段简单的C++代码实现该思路: ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; struct Meeting { int start; int end; }; bool compare(Meeting m1, Meeting m2){ return (m1.end < m2.end); } void maxMeetings(vector<Meeting> meetings) { sort(meetings.begin(), meetings.end(), compare); vector<int> selected_meetings; selected_meetings.push_back(0); // Select first meeting as it ends the earliest. for(int i = 1; i < meetings.size(); ++i){ if(meetings[i].start >= meetings[selected_meetings.back()].end){ selected_meetings.push_back(i); } } cout << "The maximum set of activities that can be executed by a single person is: "; for(auto idx : selected_meetings){ cout << "(" << meetings[idx].start << ", " << meetings[idx].end << ") "; } } ``` 这段程序定义了一个`Meeting`结构体表示单次会议的信息,并实现了比较函数以便按照结束时间会议进行排序。主逻辑部分则遵循前面提到的贪心策略挑选合适的会议[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JustEasyCode

谢谢您

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

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

打赏作者

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

抵扣说明:

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

余额充值