春春是一名道路工程師,負責鋪設一條長度為 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...