問題:區間完全覆蓋問題
問題描述:給定乙個長度為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...