题目
假设要在足够多的会场里安排一批活动,n个活动编号为 1~n,每个活动有开始时间b[i]和结束时间e[i] (1<=i<=n)
设计一个有效的贪心算法,求出最少的会场个数。
代码
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define MAX 51 //问题表示
struct Action //活动的类型声明
{
int b; //活动起始时间
int e; //活动结束时间
bool operator<(const Action &s) const //重载<关系函数
{
if (e==s.e) //结束时间相同按开始时间递增排序
return b<=s.b;
else //否则按结束时间递增排序
return e<=s.e;
}
};
int n=5;
Action A[]={{0},{1,10},{2,4},{3,6},{5,8},{4,7}}; //下标0不用
//求解结果表示
int ans; //最少会场个数
void solve() //求解最大兼容活动子集
{
bool flag[MAX]; //活动标志
memset(flag,0,sizeof(flag));
sort(A+1,A+n+1); //A[1..n]按指定方式排序
ans=0; //会场个数
for (int j=1;j<=n;j++)
{
if (!flag[j])
{
flag[j]=true;
int preend=j; //前一个兼容活动的下标
for (int i=preend+1;i<=n;i++)
{
if (A[i].b>=A[preend].e && !flag[i])
{
preend=i;
flag[i]=true;
}
}
ans++; //增加一个最大兼容活动子集
}
}
}
int main()
{
solve();
printf("求解结果\n");
printf("最少会场个数: %d\n",ans); //输出4
return 0;
}
以下为我的微信公众号:技术经理的成长
会不定期进行更新,欢迎关注