貪心法 區間完全覆蓋問題

2021-10-02 02:56:20 字數 1983 閱讀 3953

問題:區間完全覆蓋問題

問題描述:給定乙個長度為m的區間,再給出n個區間的起點和終點,求最少使用多少個區間可以將整個區間完全覆蓋。

方法:• 先將n個區間按照起點進行遞增排序。

• 令s表示已經覆蓋到的區域。再剩下的區間中找出所有左端點小於等於當前已經覆蓋到的區域s並且右端點大於等於s的區間,取右端點最大的區間加入,直到已經覆蓋全部的區域。

舉例:m為10

n = 7:[1,5]、[1,6]、[3,6]、[1,7]、[6,9]、[9,10]、[7,9]。

步驟:1.先將n按照左端點遞增進行排序,得到:[1,5]、[1,6]、[1,7]、[3,6]、[6,9]、[7,9]、[9,10]

2.然後取第乙個區間為[1,7],因為7是從1開始最遠的區間右端點,s變成7。

3.然後從接下來的區間中找左端點小於等於7,並且右端點大於等於7的區間,有[6,9]、[7,9]。則取[7,9],s變成9

4…然後從接下來的區間中找左端點小於等於9,並且右端點大於等於9的區間,有[9,10],只有選它,並且覆蓋成功,結果為3。

#include

#include

using namespace std;

const int maxn = 1000;

int n, t;

struct intervala[maxn], result[maxn];

int cmp(const interval &a, const interval &b)

void solve()

}else

}if(s >= e)

else

}if(ok) printf("%d\n", count);

else printf("-1\n");

for(int k=0; k完全區間覆蓋問題

#include

#include

using namespace std;

const int maxn = 1000;

int n, t;

struct intervala[maxn], result[maxn];

int cmp(const interval &a, const interval &b)

void solve()

}else

}if(index==n-1)

if(count) printf("%d\n", count);

else printf("-1\n");

for(int k=0; k數軸上有n個閉區間[ai, bi],選擇盡量少的區間覆蓋一條指定線段[s, t]。

用貪心法解決這個問題的思路如下:

(1)找到所有的、起點小於s的區間

(2)把這些區間按照起點,從小到大排序

(3)選擇終點最大的那個區間,設這個最大的終點是bi

(4)現在問題變成了,「選擇盡量少的區間覆蓋一條指定線段[bi, t]」

思路:把噴水裝置的覆蓋範圍轉化為一段區間,然後問題變成區間完全覆蓋問題

#include

#include

#include

using std::sort;

struct nodes[1005];

int cmp(node a, node b)

int main()

}sort(s, s+j, cmp);//排序

// for(i = 0; i < j; i ++)

if(s[0].le > 0) //如果第乙個要大於0, 就是0到不了,直接輸出0

double end = 0;

i = 0;

int cou = 0;

while(end <= w&&i < j&&cou <= n)

end = temp+0.000001;//每次都只加上0.00001,倆區間有斷點,就能區分

++cou;

}if(end < w||cou > n)

else

}return 0;

}

貪心法 區間覆蓋問題

區間覆蓋問題。數軸上有n個閉區間 a i,bi 選擇盡量少的區間覆蓋一條指定線段 s t 先進行預處理,將不包含 s t 的區間都去掉,然後再按左區間從小到大排序。如果最小區間的左區間大於 s 的話,則無解。選取包含 s的右區間最大的區間,該區間的右區間仍然小於下乙個區間的左區間,則無解。按照這樣的...

區間完全覆蓋問題(貪心)

題意 在乙個矩形的花壇上,中間水平放了一排噴水裝置,澆灌半徑為r,問最少需要多少個裝置可以潤濕整個花壇。將每個裝置轉換成一條線段,就變成了求最少的線段覆蓋整個區間。將各線段左端點從小到大排序 設已覆蓋區間的右端點為ed 每次貪心選擇起點小於ed的線段中右端點最大的那一條,然後更新ed。1 inclu...

區間覆蓋問題 逆向貪心法簡單

problem description 用i來表示x座標軸上座標為 i 1,i 的長度為1的區間,並給出n 1 n 200 個不同的整數,表示n個這樣的區間。現在要求畫m條線段覆蓋住所有的區間,條件是 每條線段可以任意長,但是要求所畫線段的長度之和最小,並且線段的數目不超過m 1 m 50 inpu...