贪心算法之相容问题(活动安排问题)

1.问题
设有n个活动的集合A={1,2,3…,n},其中每个活动都要求使用同一资源(一个时间段只能安排一个活动)。每个活动都有一个起始时间st和一个结束时间ft。如果选择了活动i,则它在半开区间[Si,Fi)时间段内占用资源。若区间[si,fi)与区间[sj,fj)不相交,则称活动i和活动j相容不冲突。活动安排问题就是在所给的活动集合中选出最大的相容子集合。

2.解析
贪心策略是 选择最早结束时间,以便使得下一个活动尽早开始,这种贪心策略的母的是使得剩余时间段极大化,从而安排尽可能多的相容活动。将所有的活动按照结束时间非减序排列。这样而来贪心选择时取当前活动集合中结束时间最早的活动就归结为取当前活动集合中排在最前面的活动。
每当选择了一个活动加入了解集合中,就要判断相应的其他活动是否与之相容。如果不相容则可以直接舍弃。在符合相容条件的解中继续选择具有最早结束时间的解。以此类推,即可得出相应的解集合。
以占用时间贪心:可能会发生一个时间较长的活动覆盖了其余时间较短的活动的情况;
以开始时间贪心:无法使得剩余时间利用率最大化。
3.设计
A={1};
J=1;
For i=2 to n do
If si>=fj
Then A+={i}
J=i;
Return A

4.分析
很明显是时间复杂度O(n)的问题。
5.源码
在这里插入图片描述

#include<map>
#include<stdlib.h>
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
#include<cmath>
#include<string>
#include<cstdio>
#include <iomanip>
using namespace std;
const int maxn = 3e5 + 10;
#define ll long long
int i, j, k;
int n, m, q;
const int inf = 0x3f3f3f;
const int mod = 1e9 + 7;
map<ll, ll> mp[30];
int gcd(int a, int b) {
	return b == 0 ? a : gcd(b, a%b);
}
int s[maxn], f[maxn];
bool id[maxn];  
int main() {
	cin >> n;
	for (i = 0; i < n; i++) {
		cin >> s[i] >> f[i];
	}
	id[1] = 1;
	j = 1;
	for (i = 2; i <= n; i++) {
		if (s[i] >= f[j]) {
			id[i] = 1;
			j = i;
		}
		else
			id[i] = 0;
	}
	for (i = 1; i <= n; i++) {
		if (id[i])
			cout << "第" << i << "个可以参加的活动 : " << "ST = " << s[i] << " FT = " << f[i] << endl;
	}
	return 0;
}

Github:
https://github.com/myycjw/activity
代码解读及食用方法:
已放在源代码注释内
Csdn博客:
本网址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值