(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