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