算法竞赛入门经典:第八章 高效算法设计 8.17 贪心之选择不相交区间

本文介绍了如何使用贪心算法解决选择不相交区间的问题。首先按照区间的右边界排序,然后依次检查每个区间,如果新区间的左边界大于等于前一个已选区间的右边界,则选择该区间并更新计数。通过这种方式,可以找到尽可能多的不相交区间。
摘要由CSDN通过智能技术生成
/*
选择不相交区间:
数轴上有n个开区间(ai,bi)。尽量选择多个区间,使得这些区间两两没有公共点

分析:
假设有两个区间x,y。区间x完全包含y。应选x。
按照bi从小到大的顺序给区间排序。

贪心策略:
一定要选第一个区间?
区间排成:b1<=b2<=b3...
情况1:
a1>a2,区间2包含区间1,此时应选区间1,a1>ai,不选i
情况2:
a1<=a2<=a3,区间1与区间2完全不相交:
                            相交  :如果不选区间2,,黑色部分无影响,区间1有效部分变成灰色部分,被区间2包含,所以区间2不能选。不能因为选任何区间放弃
							        区间1,所以选择区间1.

实现:
选择区间1后,需要把所有和区间1相交的区间排除在外,需要记录上一个被选择的区间编号。排序后只需要扫描一次即可完成贪心过程
输入:
12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
输出:
5
*/

/*
关键:
1 通过区间的右值进行比较 	bool operator < (const Section& sec)//自定义比较函数,以右区间进行比较
	{
		return iEnd < sec.iEnd;
	}
2 if(sec[i].iBeg >= sec[iCur].iEnd)//或者后区间的左值>=前区间的右值,符合
*/

#include <stdio.h>
#include <algorithm>

#define MAXSIZE 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值