基于贪心算法的区间覆盖问题 附代码
(1)区间完全覆盖问题
问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖
样例:区间长度8,可选的覆盖线段[2,6],[1,4],[3,6],[3,7],[6,8],[2,4],[3,5]
解题过程:
1.将每一个区间按照左端点递增顺序排列,排完序后为[1,4],[2,4],[2,6],[3,5],[3,6],[3,7],[6,8]
2.设置两个变量 last 和 far
last 表示当前已经覆盖到的区域的最右边距离 .
far 表示在剩下的线段中找到的所有左端点小于等于当前已经覆盖到的区域的右端点的线段中,不断更新 最右边的距离
3.重复以上过程 直到区间全部覆盖 否则 区间不能全部覆盖
int solve() { int cnt = 0; double last = 0,far = 0; for(int i=0;i < num;i++) { if(last >= l) return cnt; if(s[i].a <= last) far = max(far , s[i].b); else if(s[i].a > last) { cnt++; last = far; if(s[i].a <= last) far = max(far,s[i].b); else return -1; } } if(last < l && far >= l) return cnt+1; if(far < l ) return -1; return cnt; }
3过程:
假设第一步加入[1,4] ,那么下一步能够选择的有[2,6],[3,5],[3,6],[3,7],由于7最大
所以下一步选择[3,7],最后一步只能选择[6,8],这个时候刚好达到了8退出,所选区间为3
参考原文:
http://blog.csdn.net/chenguolinblog/article/details/7882316