問題描述:用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 31 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 輸入包括多組資料,每組資料的第一行表...