欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-13 15:26:10
...

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博客:
本网址

相关标签: 贪心 算法