一、简介
贪心算法在对问题求解时,不从整体最优上加以考虑,而是做出在当前看来是最好的选择。
二、区间与点
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