活动安排问题:贪心算法————(C++实现)

问题描述:设n个活动的集合E={1,2,3,……,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,si
输入形式:第1行为一个整数n,n≤100,表示活动的个数。后面为n行,每行两个整数,为活动的开始时间和结束时间。
输出形式:一个整数,表示最大的相容活动子集的元素个数。
样例输入:

活动安排问题:贪心算法————(C++实现)_第1张图片

 求解步骤:

这个问题可以通过贪心算法求解,具体步骤如下:

1. 将活动按照结束时间从小到大进行排序。

2. 初始化一个空的相容活动子集S。

3. 遍历排序后的活动列表。 - 对于每个活动i,如果该活动与S中的所有活动都相容(即与S中任意一个活动的时间区间不重叠),则将该活动加入S。

4. 返回S作为最大相容活动子集。 贪心算法的思路是,优先选择结束时间早的活动,因为结束时间早的活动留下的空闲时间多,可以给其他活动提供更多机会。通过这种方式,可以找到一个最大的相容活动子集。 需要注意的是,在遍历并判断相容性时,可以使用贪心策略。如果当前活动与S中的最后一个活动不相容(即时间区间重叠),则直接跳过该活动,不加入S中。这种策略的正确性可以通过反证法进行证明。 总之,通过贪心算法,我们可以找到一个最大的相容活动子集。

c++代码

#include
using namespace std;
void sort(int n,int s[],int f[])
{
	int a,b,i,j;
	for(i=1;i<=n;i++)
	{
		for(j=i+1;j<=n;j++)
		{
			if(f[i]>f[j])
			{
				a=f[i];f[i]=f[j];f[j]=a;
				b=s[i];s[i]=s[j];s[j]=b;
			}
		}
	 } 
}
int GreedySelect(int n,int s[],int f[],bool A[])
{
	A[1]=true;
	int j=1,count=1; 
	for(int i=2;i<=n;i++){
		if(s[i]>=f[j]){
			A[i]=1;
			j=i;
			count++; 
		}
		else A[i]=0;
	     
	} 
	return count;
}

int main(){
	int n,s[50],f[50];
	bool A[50];
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>s[i]>>f[i];
	} 
	sort(n,s,f);
	cout<

结果输出

活动安排问题:贪心算法————(C++实现)_第2张图片

你可能感兴趣的:(贪心算法,算法,c++)