贪心问题

一、简介

贪心算法在对问题求解时,不从整体最优上加以考虑,而是做出在当前看来是最好的选择

二、区间与点

1、区间划分问题

题目描述
时间轴上有n个开区间 ( a i , b i ) (a_i,b_i) (ai,bi),把这些区间至少划分成多少个集合,使得每个集合中的区间两两没有公共点。求需要划分成的最少集合数。

贪心策略
因为需要尽量少的集合数量,所以一个集合内要尽量装更多的区间。所以要按区间起始点从小到大排序,起始点相同的按末尾从小到大排序
定义一个数组(t)来记录该集合中区间的最末尾处。由题意,至少要一个集合所以 t 1 t_1 t1的初始值为第一个集合的末尾点位置枚举当前区间可以被放在的集合如果该区间无法被任何一个已开区间划入就新开一个区间来存储

t[1]=s[1].end;/*第一个集合末尾初始值更新*/
for(int i=2/*跳过第一个区间*/;i<=n;i++) {
   
	int f=0;/*有没有被划入*/
	for(int j=1;j<=ans;j++)/*尽量从先开的数组来枚举*/
		if(s[i].start>=t[j])/*可以接上*/ {
   
			t[j]=s[i].end/*该集合末尾更新*/,f=1/*被划入*/;
			break;
		}
	if(!f) t[++ans]=s[i].end;/*未被划入就新开集合*/
}

2、活动安排

题目描述
设有 n n n个活动的集合 E = { 1 , 2 , ⋯   , n } E=\{1,2,\cdots,n\} E={ 1,2,,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动 i i i都有一个要求使用该资源的起始时间 s i s_i

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值