鋪設道路(NOIP2018提高組day1)

2021-09-01 12:44:45 字數 1513 閱讀 3923

春春是一名道路工程師,負責鋪設一條長度為 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。在選擇區間時,需要保證,區間內的每塊...