簡單的區間覆蓋問題

2021-07-05 06:21:29 字數 2114 閱讀 3807

問題描述:用i表示

x軸上座標為

[i-1,i]

的區間(區間長度為

1),並給出

m個不同的整數來表示

m個這樣的區間。現在要求畫出幾條線段覆蓋住所有的區間,條件是:每條線段可任意長,但要求所畫線段長度之和最小,並且線段的數目不超過n。

分析

1) 整型陣列p[m]表示所有從0開始的區間長度,假設p[m]已經

按從小到大的順序排好;

2) 如果n>=m,

那麼用 m條長度為 1 的線段可以覆蓋住所有的區間

,所求的線段總長為 m;

3)如果n<m,可以按照如下的貪心準則解決:

① 如果n=1,即要用一條線段覆蓋住所有區間。

線段總長:p[m-1]-p[0]+1。

其中:p[0]=1  ,  p[1]=3  ,   p[2]=4 , ……,p[m-1]=m--區間總長度

② 如果n=2,即要用 2 條線段覆蓋住所有區間,相當於把n=1中的線段分為兩部分,各覆蓋左、右區間。

如果線段在m個區間中不相鄰的區間之間斷開(如在p[0]與p[1]之間),這樣總長度小於斷開之前。【不相鄰的很多怎麼辦?】

線段總長度減少: p[1]-p[0]-1

回顧我們的題目要求:求最小線段總長。

找到間隔最大的兩個相鄰區間,將之斷開。

這一過程相當於找:d[i]=p[i]-p[i-1]-1(1<i<m)的最大值

如果n=3,相當於在n=2的方案下,將某條線段斷成兩截,並作可能的端點調整。

為了得到當前情況下最小的總長度,同樣應該在間隔最大的兩個相鄰區間之間斷開

如果原來的方案是n=2時總長最小的方案,這一操作是n=3時總長最小的方案。

當n=k(k>1)時依此類推,只需在n=k-1時最小總長的覆蓋方案下,找到被同一條線段覆蓋的間隔最大的兩個相鄰區間

------「貪心」地從間隔處斷開並調整兩邊線段的端點,就可以得到總長最小的方案

貪心策略就是每次從找到當前間隔最大的相鄰區間

例題用i來表示x座標軸上座標為[i-1,i]的長度為1的區間,並給出n(1≤n≤200)個不同的整數,表示n個這樣的區間。

現在要求畫m條線段覆蓋住所有的區間,

條件是:每條線段可以任意長,但是要求所畫線段的長度之和最小,

並且線段的數目不超過n。

輸入包括多組資料,每組資料的第一行表示點n,和所需線段數m,後面的n行表示點的座標

輸出每組輸出佔一行表示線段的長度。

5 3

1 3 5 8 11

7
**

#include #include using namespace std;

int a[1000];

int s[1000];

int cmp(int a,int b)

int main()

sort(a,a+n);

len=a[n-1]-a[0]+1;

for(int i=0;i

整個過程說白了就是排序,沒啥。

區間覆蓋問題

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

區間覆蓋問題

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

區間覆蓋問題

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