春春是一名道路工程師,負責鋪設一條長度為 n 的道路。
鋪設道路的主要工作是填平下陷的地表。整段道路可以看作是 n 塊首尾相連的區
域,一開始,第 i 塊區域下陷的深度為 d
id i
di。春春每天可以選擇一段連續區間[l,
r]
[l,r]
[l,r
],填充這段區間中的每塊區域,讓其下陷深
度減少 1。在選擇區間時,需要保證,區間內的每塊區域在填充前下陷深度均不為 0 。
春春希望你能幫他設計一種方案,可以在最短的時間內將整段道路的下陷深度都變
為 0 。
輸入檔名為 road.in 。
輸入檔案包含兩行,第一行包含乙個整數 n,表示道路的長度。
第二行包含 n 個整數,相鄰兩數間用乙個空格隔開,第 i 個整數為 d i 。
輸出檔名為 road.out 。
輸出檔案僅包含乙個整數,即最少需要多少天才能完成任務。
road.in road.out
6
4 3 2 5 3 5
9
見選手目錄下的 road/road1.in 和 road/road1.ans 。
一種可行的最佳方案是,依次選擇:
[1,6]、[1,6]、[1,2]、[1,1]、[4,6]、[4,4]、[4,4]、[6,6]、[6,6]。
見選手目錄下的 road/road2.in 和 road/road2.ans 。
3;70% 的資料,1 ≤ ? ≤ 10;
對於 100% 的資料,1 ≤ ? ≤ 100000 ,0 ≤ d i ≤ 10000 。
從左到右依次遍歷陣列,為了盡可能快的填充所有的坑,先將第乙個坑填掉。如果第二個坑的深度小於等於第乙個坑的深度,則在填充第乙個坑的時候,第二個坑也一併被填掉了;如果第三個坑小於等於第二個坑,那麼在填充第二個坑的時候,第三個坑也一併被填充掉了……以此類推,只要後面乙個坑的深度小於等於前面乙個坑的深度,那麼就可以跟第乙個坑一併填充,否則必須單另填充它。
#include#include#includeusing namespace std;
const int maxn=1e5+5;
int n,a[maxn],ans;
int main()
每次我們從當前序列當中選擇乙個深度最小的坑進行處理,處理完成之後,當前序列有可能當前序列被0分割成若干的子串行,那麼繼續處理這些子串行,最後全部處理完即可得到答案。
尋找最小值的位置可以使用rmq演算法來優化。
優化前**
#includeconst int maxn=1e5+5;
int n,a[maxn],ans;
int dg(int l,int r,int d)//[l,r]為填充區間,d為已經填充的天數
}}int rmq(int l, int r)
int dg(int l,int r,int d)
int main()
NOIP 2018 提高組 鋪設道路
傳送門 題目描述 春春是一名道路工程師,負責鋪設一條長度為 n nn 的道路。鋪設道路的主要工作是填平下陷的地表。整段道路可以看作是 n nn 塊首尾相連的區域,一開始,第 i ii 塊區域下陷的深度為 d id i di 春春每天可以選擇一段連續區間 l ll r rr 填充這段區間中的每塊區域,...
noip2018 鋪設道路
退役oier day1t1見ancestor 一道odt板子題都沒人寫?主要 考場 思路 從小到大解決深度 每次解決乙個深度,貢獻就是與上乙個深度之差乘上區間個數 之後就統統split 暴力列舉深度那裡珂以用hash優化暴列舉的常數,懶得搞 複雜度因為每次split會刪掉乙個點,所以是嚴格nlogn...
道路鋪設 NOIP2018
春春是一名道路工程師,負責鋪設一條長度為 n 的道路。鋪設道路的主要工作是填平下陷的地表。整段道路可以看作是 n 塊首尾相連的區 域,一開始,第 i 塊區域下陷的深度為 di 春春每天可以選擇一段連續區間 l,r 填充這段區間中的每塊區域,讓其下陷深 度減少 1。在選擇區間時,需要保證,區間內的每塊...