贪心算法:活动安排问题

博客围绕活动安排问题展开,该问题要求在给定活动集合中选出最大相容活动子集。介绍了活动安排问题的描述、输入输出要求,并给出示例。依据贪心算法思想,关键在于判断结束时间以确保相容数量最大,还给出了相关源码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【Description】
设有n个活动的集合E={1,2,3······n},其中每个活动都要求使用同一个资源(如演讲会场),而在同一时间内只有一个活动能使用这一资源,每个活动i都有一个要求使用该资源的起始时间Si和一个结束时间Fi,且Si<Fi。如果选择了活动i,则他再改时间区域[Si,Fi]内占用资源,若区间[Si,Fi]和区间[Si,Fi]互不相交,则称活动i与活动j是相容的,活动安排问题要求在所给的活动集合范围内选出最大的相容的活动子集。

【Input】
首先输入n个教室,其次输入n行,每行两个数字,表示开始的时间和结束时间

【Output】
输出最少需要几个教室

【Sample Input】
3
1 2
3 4
2 9

【Sample Output】
2

**问题分析:**根据贪心算法的思想,我们要确保的是相容的数量最大,那么我们要求的就是结束的最早,也就是关键点在于判断结束时间、

源码如下:

#include<iostream>
#include<algorithm>
using namespace std;

struct Time
{
	int start;
	int end;
}time[255];

bool cmp(Time &a,Time &b)
{
    if (a.end<=b.end) 
		return true;
    return false;
}

void Getmin(Time time[],int n,int b[])//带入结构体数组(排序之后的) 只是给b数组赋值的函数
{
	b[1]=1;//第一个活动肯定进入总时间
	int next=1;//next是最近加入的活动的编号
	for(int i=2;i<=n;i++)//遍历
	{
		if(time[i].start >= time[next].end)
		{
			b[i]=1;
			next=i;
		}
	}

}


int main()
{
	int n,b[255],sum=0;//n个教室 b是记入最近加入时间表的活动的编号
	cin>>n;
	memset(b,0,sizeof(b));
	for(int i=1;i<=n;i++)
		cin>>time[i].start>>time[i].end;
	sort(time,time+n+1,cmp);//从小到大排序 根据的是结束时间
	Getmin(time,n,b);
	for(int j=1;j<=n;j++)
	{
		if(b[j] == 1)
			sum++;
	}
	cout<<sum<<endl;
	return 1;

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值