【貪心】活動安排問題

活動安排問題就是要在所給的活動集合中選出最大的相容活動子集合,是可以用貪心算法有效求解的很好例子。該問題要求高效地安排一系列爭用某一公共資源的活動。貪心算法提供了一個簡單、漂亮的方法使得儘可能多的活動能兼容地使用公共資源。

        設有n個活動的集合E={1,2,…,n},其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有一個活動能使用這一資源。每個活動i都有一個要求使用該資源的起始時間si和一個結束時間fi,且si <fi 。如果選擇了活動i,則它在半開時間區間[si, fi]內佔用資源。若區間[si, fi]與區間[sj, fj]不相交,則稱活動i與活動j是相容的。也就是說,當si≥fj或sj≥fi時,活動i與活動j相容。

     該算法的貪心選擇的意義是使剩餘的可安排時間段極大化,以便安排儘可能多的相容活動。

      如果所給出的活動未按非減序排列,可以用O(nlogn)的時間重排。

     貪心算法並不總能求得問題的整體最優解。但對於活動安排問題,貪心算法卻總能求得的整體最優解,即它最終所確定的相容活動集合A的規模最大。這個結論可以用數學歸納法證明。

#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;
 
typedef struct{
	int s;//開始時間
	int f;//結束時間
}node;
 
int cmp(const void *a, const void *b)
{
	return ((node *)a)->f-((node *)b)->f;//按結束時間升序排列
}
 
void main()
{
	int i, j=0, n;
	int count=1;
	node a[100];	
	cin>>n;
	for(i=0; i<n; i++)
		cin>>a[i].s>>a[i].f;
 
	qsort(a, n, sizeof(a[0]), cmp);
 
	for(i=1; i<n; i++)
	{
		if(a[i].s>a[j].f)
		{
			j=i;
			count++;
		}
	}
 
	cout<<count<<endl;
}

算法複習筆記(分治法、動態規劃、貪心算法) - CSDN博客
https://blog.csdn.net/king_like_coding/article/details/51865450

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章