區間覆蓋問題 題解

2021-07-09 09:34:38 字數 1833 閱讀 6971

【問題描述】

給n個閉區間[ai,bi],選擇盡量少的區間覆蓋一條指定線段[s,t]。

1 10 7

2 51 4

3 83 10

7 10

4 61 3 2

首先,我們可以將bi小於s的資料都去除,因為這些都是無用的,這樣可以減少一些時間複雜度。然後以ai為關鍵字從小到大進行排序,r賦值為b[1],從第二個開始取,如果當前的ai比上乙個取的區間的bi小,記錄下當前的bi,選擇最大的bi所佔的區間,更新r,直到r>=t。

1

type rec=record

2a,b:longint;

3end;4

var c:array[1..1000] of

rec;

5i,n,s,t,ans,j,r,pos,max:longint;

6y:rec;

7procedure

sort(l,r: longint);

8var

9i,j,x: longint;

10y:rec;

11begin

12 i:=l;

13 j:=r;

14 x:=c[(l+r) div

2].a;

15repeat

16while c[i].ado

17inc(i);

18while xdo

19dec(j);

20if

not(i>j) then

21begin

22 y:=c[i];

23 c[i]:=c[j];

24 c[j]:=y;

25inc(i);

26 j:=j-1;27

end;

28until i>j;

29if lthen

30sort(l,j);

31if ithen

32sort(i,r);

33end;34

begin

35readln(s,t);

36readln(n);

37for i:=1

to n do

38with c[i] do

39begin

40readln(a,b);

41if b<=s then

42 a:=maxlongint;//預處理

43end

;44 sort(1

,n);

45if c[1].a>s then//如果最小的ai比s大,那麼s必定無法被覆蓋,因此無解

46begin

47 writeln('

no answer');

48halt;

49end

;50 r:=c[1].b;pos:=1;ans:=1;//減少時間複雜度,設pos變數,從上乙個所取的區間的後乙個開始取

51repeat

52 max:=0;53

for i:=pos+1

to n do

54if (c[i].a<=r)and(c[i].b>max) then

55begin

56 pos:=i;

57 max:=c[i].b;

58end

;59 r:=max;

60inc(ans);

61until r>=t;

62writeln(ans);

63end.

貪心 區間覆蓋(題解)

題意 數軸上有 n 1 n 25000 個閉區間 ai,bi 選擇盡量少的區間覆蓋一條指定線段 1,t 1 t 1,000,000 覆蓋整點,即 1,2 3,4 可以覆蓋 1,4 不可能辦到輸出 1 思路 首先進行預處理,將不在區間 1,t 內的區間砍掉,然後按照左端點從小到大進行排序,當左端點相同...

區間覆蓋問題

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條線段覆蓋住所有的區間,條件是 每條線段可以任意長,但是要求所畫線段的長度之和最小,並且線段的...