算法分析-贪心打卡1

贪心算法

选择当前看来最好的解,局部上的最优解。适合最优子结构,即大问题的最优解包含子问题的最优解

求解蓄栏保留问题

农场里有n头牛,每头牛会有一个特定的时间区间[a,b]在蓄栏利挤牛奶,并且一个栏内任何时刻只能有一头牛挤奶,求最少蓄栏能够满足上述要求,并给出安排方案
解:设牛的编号1-n,活动的时间是闭区间,不能重复,所以将所有活动排序:结束时间相同按开始时间递增排序,否则按时间结束时间递减排序。
找出一个最大兼容活动子集,个数就是最少蓄栏的个数。

i1234567
开始时间125841211
结束时间4579101315
1346
12812
47913

这是一个最大兼容活动子集,同样2、7是一个子集,5又是一个自己,最大兼容活动子集个数为3

// 问题表示
struct Cow               //奶牛的类型声明
{	int no;//编号
	int b;//起始时间
	int e;//结束时间
	bool operator<(const Cow &s) const //重载关系函数
	{	if(e==s.e)    //结束时间相同按开始时间递增排序
			return b<= s.b;		
		else
			return e<=s.e;		//否则按结束时间递减排序
	}
};
int ans[MAX];	//表示结果,ans[i]表示第A[i].no头牛的蓄栏编号
int n=5;
Cow A[]={{0},{1,1,10},{2,2,4},{3,3,6},{4,5,8},{5,4,7}};
// 求解最大兼容活动子集个数
void solve()
{	sort(A+1,A+n+1);
	memset(ans,0,sizeof(ans));
	int num=1;
	for(int i=1;i<=n;i++)
	{	if (ans[i]==0)   //第i头牛没有安排蓄栏
		{	ans[i]=num;	//给他安排num
			int preend=A[i].e;  //前一个兼容活动结束时间
			for(int j=i+1;j<=n;j++)
			{	if(A[j].b>preend && ans[j]=0)
				{ ans[j]=num;  //将兼容活动子集中活动安排在num蓄栏中
				  preend=A[j].e;  //更新结束时间
				 }
			}
			num++;   //查找下一个最大兼容活动子集,num+1
		}
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值