NOIP2011 觀光公交(貪心)

2022-08-11 05:06:10 字數 3254 閱讀 8189

風景迷人的小城y 市,擁有n 個美麗的景點。由於慕名而來的遊客越來越多,y 市特意安排了一輛觀光公交車,為遊客提供更便捷的交通服務。觀光公交車在第 0 分鐘出現在 1號景點,隨後依次前往 2、3 、4 ……n 號景點。從第 i 號景點開到第 i+1 號景點需要 di 分鐘。任意時刻,公交車只能往前開,或在景點處等待。

設共有m 個遊客,每位遊客需要乘車1 次從乙個景點到達另乙個景點,第i 位遊客在ti 分鐘來到景點 ai ,希望乘車前往景點bi (aii )。為了使所有乘客都能順利到達目的地,公交車在每站都必須等待需要從該景點出發的所有乘客都上車後才能出發開往下一景點。

假設乘客上下車不需要時間。

乙個乘客的旅行時間,等於他到達目的地的時刻減去他來到出發地的時刻。因為只有一輛觀光車,有時候還要停下來等其他乘客,乘客們紛紛抱怨旅行時間太長了。於是聰明的司機zz給公交車安裝了 k 個氮氣加速器,每使用乙個加速器,可以使其中乙個 di 減1 。對於同乙個di 可以重複使用加速器,但是必須保證使用後di 大於等於0 。

那麼zz該如何安排使用加速器,才能使所有乘客的旅行時間總和最小?

輸入格式:

輸入檔名為bus.in。

第1 行是3 個整數n, m, k ,每兩個整數之間用乙個空格隔開。分別表示景點數、乘客數和氮氣加速器個數。

第2 行是n-1 個整數,每兩個整數之間用乙個空格隔開,第i 個數表示從第i 個景點開往第i+1 個景點所需要的時間,即 di 。

第3 行至m+2 行每行3 個整數 ti, ai, bi,每兩個整數之間用乙個空格隔開。第 i+2 行表示第i 位乘客來到出發景點的時刻,出發的景點編號和到達的景點編號。

輸出格式:

輸出檔名為bus.out。共一行,包含乙個整數,表示最小的總旅行時間。

輸入樣例#1:

3 3 2

1 40 1 3

1 1 2

5 2 3

輸出樣例#1:

10

【輸入輸出樣例說明】

對d2 使用2 個加速器,從2 號景點到 3 號景點時間變為 2 分鐘。

公交車在第1 分鐘從1 號景點出發,第2 分鐘到達2 號景點,第5 分鐘從2 號景點出發,第7 分鐘到達 3 號景點。

第1 個旅客旅行時間 7-0 = 7 分鐘。

第2 個旅客旅行時間 2-1 = 1 分鐘。

第3 個旅客旅行時間 7-5 = 2 分鐘。

總時間 7+1+2 = 10分鐘。

【資料範圍】

對於10% 的資料,k=0 ;

對於20% 的資料,k=1 ;

對於40% 的資料,2 ≤ n ≤ 50,1 ≤ m ≤ 1,000,0 ≤ k ≤ 20,0 ≤ di ≤ 10,0 ≤ t i ≤ 500;

對於60% 的資料,1 ≤ n ≤ 100,1 ≤ m ≤ 1,000,0 ≤ k ≤ 100 ,0 ≤ di ≤ 100,0 ≤ t i ≤ 10,000 ;

對於100%的資料,1 ≤ n ≤ 1,000,1 ≤ m ≤ 10,000 ,0 ≤ k ≤ 100,000,0 ≤ di ≤ 100 ,0 ≤ t i ≤ 100,000。

noip2011提高組day2第3題

1

var2

n,m,k,i,j :longint;

3 f,g,t,d,sum :array[0..100050] of

longint;

4 time,from,too :array[0..100050] of

longint;

5ans :int64;

6cur,x :longint;78

function

max(x,y:longint):longint;

9begin

10if x>y then exit(x) else

exit(y);

11end;12

13begin

14read(n,m,k);

15for i:=1

to n-1

doread(d[i]);

16for i:=1

to m do

17begin

18read(time[i],from[i],too[i]);

19 f[from[i]]:=max(f[from[i]],time[i]);

20inc(sum[too[i]]);

21end;22

for i:=1

to n do sum[i]:=sum[i-1]+sum[i];

23for i:=2

to n do t[i]:=max(t[i-1],f[i-1])+d[i-1

];24

for i:=1

to m do ans:=ans+t[too[i]]-time[i];

25while (k>0) do

26begin

27 g[n]:=n;

28 g[n-1]:=n;

29for i:=n-2

downto1do

if t[i+1]<=f[i+1] then g[i]:=i+1

else g[i]:=g[i+1

];30 cur:=0;31

for i:=1

to n do

32begin

33if (curand (d[i]>0) then

34begin

35 cur:=sum[g[i]]-sum[i];

36 x:=i;

37end;38

end;

39if (cur=0) then

break;

40dec(ans,cur);

41dec(d[x]);

42dec(k);

43 t[1]:=0;44

for i:=2

to n do t[i]:=max(t[i-1],f[i-1])+d[i-1

];45

end;

46writeln(ans);

47end.

NOIP2011 觀光公交 貪心 遞推

傳送門 60 資料 也許能用dp 100 資料 k範圍太大,不能dp 題解 想一想貪心。如果只有乙個加速器,我們肯定選乘坐人數最多的那條路。擴充套件到m個加速器的情況,只需要每次選取乘坐人數最多的路,使用加速器更新答案,就行了。對於乙個站,可以分成兩種情況 車等人,人等車。因此,使用乙個加速器,只會...

NOIP2011 觀光公交

題目 分析 設last i 表示來到第i個景點的乘客最晚的時間,time i 表示車到達第i個景點的最小時間。因為每個乘客到達的時間已經固定,所以要使總時間最小,就是使 time down i 最小,其中down i 代表每位乘客的目的地。先考慮不用加速器的情況。可以直接遞推求出答案,time i ...

NOIP2011 觀光公交

傳送門 luogu 有點麻煩,幸好 o n 2 能過。貪心地想一想,我們如果要用加速器,肯定是要選擇車上人數最多的時段加速。但是我們就會面臨這樣的情況 那麼我們就分類討論一下,預處理一些東西 每個站的下車人數,需要更新的車到站時間,每個站的最後乙個下車人數。然後隨便搞一下就好了。include in...