活动选择问题

假定一个有n个活动(activity)的集合S={a1,a​2,…,an},这些活动使用同一个资源(例如同一个阶梯教室),而这个资源在某个时刻只能供一个活动使用。每个活动a​i都有一个开始时间s​i和一个结束时间f​i,其中0<=s​i<f​i<=32767。如果被选中,任务a​i发生在半开时间区间[si,f​i)期间。如果两个活动a​i和a​j满足[s​i,f​i)和[s​j,fj)不重叠,则称它们是兼容的。也就说,若s​i>=fj或sj>=f​i,则a​i和a​j是兼容的。在活动选择问题中,我们希望选出一个最大兼容活动集。

输入格式:
第一行一个整数n(n≤1000);

接下来的n行,每行两个整数,第一个s​i,第二个是f​i(0<=si<fi<=32767)。

输出格式:
输出最多能安排的活动个数。

输入样例:
11
3 5
1 4
12 14
8 12
0 6
8 11
6 10
5 7
3 8
5 9
2 13
输出样例:
4
样例解释:
安排的4个活动为1 4, 5 7, 8 11和12 14。

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct activity
{
	int si,ei;
};
int cmp(activity a,activity b)
{
	return a.ei<b.ei;
}

int main()
{
	int n;
	activity a[1001];
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>a[i].si>>a[i].ei;
	sort(a,a+n,cmp);
	int sum=1;
	int final=a[0].ei;
	for(int i=1;i<n;i++)
	{
		if(a[i].si>=final)
		{
			sum++;
			final=a[i].ei;
		}
	}
	cout<<sum;
	return 0;
 } 
### 贪心算法在活动选择问题中的应用 #### 活动选择问题描述 给定一系列带有开始时间结束时间活动,目标是从这些活动中选出尽可能多的互不重叠的活动。这意味着要找到一个最大的兼容活动集合。 #### 解决方案概述 贪心算法通过每次选择最早完成的活动来构建解决方案[^3]。这种方法确保了剩下的可用时间段最大,从而允许更多的后续活动被选中。 #### 实现细节 为了有效地实施这一策略,首先按照各活动结束时间对它们进行升序排序。接着遍历已排序列表,在遇到的第一个可以加入到已有集合而不会造成冲突的新活动时将其纳入结果集。重复此过程直到处理完所有候选活动为止。 以下是Python代码示例展示了如何利用贪心法解决这个问题: ```python def activity_selection(activities): # activities is a list of tuples (start_time, end_time) # Sort the activities based on their finish times. sorted_activities = sorted(activities, key=lambda x: x[1]) selected_activities = [] last_selected_end_time = float('-inf') for start, end in sorted_activities: if start >= last_selected_end_time: selected_activities.append((start, end)) last_selected_end_time = end return selected_activities ``` 该函数接收一组表示不同活动起始与终止时刻的元组作为输入参数,并返回由选定活动组成的列表。注意这里假设不存在两个具有相同结束时间的不同活动;如果有,则可能需要额外逻辑来打破平局情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值