基於貪心算法的區間覆蓋問題 附代碼


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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM