洛谷 貪心 遞推 P5019 鋪設道路

2021-10-24 19:27:56 字數 1907 閱讀 4726

春春是一名道路工程師,負責鋪設一條長度為 n

nn 的道路。

鋪設道路的主要工作是填平下陷的地表。整段道路可以看作是 n

nn 塊首尾相連的區域,一開始,第 i

ii 塊區域下陷的深度為 d

id_i

di​ 。

春春每天可以選擇一段連續區間[l,

r]

[l,r]

[l,r

] ,填充這段區間中的每塊區域,讓其下陷深度減少 1

11。在選擇區間時,需要保證,區間內的 每塊區域在填充前下陷深度均不為 0

00 。

春春希望你能幫他設計一種方案,可以在最短的時間內將整段道路的下陷深度都變為 0

00 。

輸入格式

輸入檔案包含兩行,第一行包含乙個整數 n

nn,表示道路的長度。 第二行包含 n

nn 個整數,相鄰兩數間用乙個空格隔開,第i

ii 個整 數為 d

id_i

di​ 。

輸出格式

輸出檔案僅包含乙個整數,即最少需要多少天才能完成任務。

輸入樣例 #1

64 3 2 5 3 5

輸出樣例 #1【樣例解釋】

一種可行的最佳方案是,依次選擇:

[ 1,

6]

[1,6]

[1,6]、[1,

6]

[1,6]

[1,6]、[1,

2]

[1,2]

[1,2]、[1,

1]

[1,1]

[1,1]、[4,

6]

[4,6]

[4,6]、[4,

4]

[4,4]

[4,4]、[4,

4]

[4,4]

[4,4]、[6,

6]

[6,6]

[6,6]、[6,

6]

[6,6]

[6,6]。

【資料規模與約定】

對於 30

%30\%

30% 的資料,1≤n

≤10

1 ≤ n ≤ 10

1≤n≤10

;對於 70

%70\%

70% 的資料,1≤n

≤1000

1 ≤ n ≤ 1000

1≤n≤10

00;對於 100

%100\%

100%

的資料,1≤n

≤100000,0

≤di≤

10000

1 ≤ n ≤ 100000 , 0 ≤ d_i ≤ 10000

1≤n≤10

0000

,0≤d

i​≤1

0000

。這題可以用遞推來做,用陣列arr來存放所有坑的深度,設f[i]為填充前i塊坑最少需要的天數,假如arr[i-1]>=arr[i]的深度,那麼在填充arr[i-1]時也一定能順帶把arr[i]的坑填掉,所以這時f[i] = f[i-1];而如果arr[i-1]#include

using

namespace std;

intmain()

; cin >> n;

int f[

100005]=

;//填充前n塊坑最少需要的天數

for(

int i =

1; i <= n; i++

) cin >> arr[i]

;for

(int i =

1; i <= n; i++

) cout << f[n]

;return0;

}當然寫法可以進一步優化,只是覺得這種寫便於理解。比如邊輸入邊遞推,以及前面計算過的資料不再使用所以不用陣列原地推也行。

洛谷 P5019 鋪設道路

假設現在有乙個坑,但旁邊又有乙個坑,你肯定會選擇把兩個同時減1,那麼小的坑肯定會被大的坑 帶著 填掉。大的坑也會減少a i a i 1 的深度,可以說是白嫖減少了1,所以我們只需要遍歷整個陣列並加上a i 與a i 1 的差即可。include using namespace std define ...

洛谷 P5019 鋪設道路

洛谷傳送門 春春是一名道路工程師,負責鋪設一條長度為 nn 的道路。鋪設道路的主要工作是填平下陷的地表。整段道路可以看作是 nn 塊首尾相連的區域,一開始,第 ii 塊區域下陷的深度為 d id i 春春每天可以選擇一段連續區間 l,r l,r 填充這段區間中的每塊區域,讓其下陷深度減少 11。在選...

洛谷 P5019 鋪設道路

題面檢視 其實看到題目的第一想法其實是二分,每一次找乙個minx,再記錄它的pos,對於 l,pos 1 和 pos 1,r 繼續做,然後一看資料範圍,1 n 100000 立刻就否決了.其實在考場上說不定我就打70分了 然後我就開始對於資料進行模擬,突然靈光一閃,發現如果對於乙個坑x,forall...