貪心 NOIP2018 鋪設道路

2022-09-03 01:51:13 字數 1010 閱讀 8005

春春是一名道路工程師,負責鋪設一條長度為\(n\)的道路。

鋪設道路的主要工作是填平下陷的地表。整段道路可以看作是\(n\)塊首尾相連的區域,一開始,第\(i\)塊區域下陷的深度為\(d_i\)。

春春每天可以選擇一段連續區間\([l,r]\) ,填充這段區間中的每塊區域,讓其下陷深度減少\(i\)。在選擇區間時,需要保證,區間內的每塊區域在填充前下陷深度均不為\(0\)。

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

輸入格式:

輸入檔案包含兩行,第一行包含乙個整數\(n\),表示道路的長度。 第二行包含\(n\)個整數,相鄰兩數間用乙個空格隔開,第\(i\)個整數\(d_i\) 。

輸出格式:

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

6

4 3 2 5 3 5

我們先考慮差分,差分前先在序列前後各補上乙個\(0\)

0 4 3 2 5 3 5 0

差分後可以得到乙個序列

4 -1 -1 3 -2 2 -5

其中正數表示道路在這個地方相比前乙個地方凹下去了,負數表示道路在這個地方相比前乙個地方凸起來了。

而我們所選擇的填充序列的開頭一定在凹下去的地方,而結尾在凸起來的地方,這樣才滿足最優。

同時我們還有乙個性質

凹下去的地方和凸起來的地方是一一對應的,即差分序列的和為\(0\)

於是我們把查分序列中正的數加起來(即統計有多少個凹下去的地方)的和就是答案。

**

#includeusing namespace std;

const int maxn=100001;

int n,ans,a[maxn];

int main()

noip2018 鋪設道路

退役oier day1t1見ancestor 一道odt板子題都沒人寫?主要 考場 思路 從小到大解決深度 每次解決乙個深度,貢獻就是與上乙個深度之差乘上區間個數 之後就統統split 暴力列舉深度那裡珂以用hash優化暴列舉的常數,懶得搞 複雜度因為每次split會刪掉乙個點,所以是嚴格nlogn...

道路鋪設 NOIP2018

春春是一名道路工程師,負責鋪設一條長度為 n 的道路。鋪設道路的主要工作是填平下陷的地表。整段道路可以看作是 n 塊首尾相連的區 域,一開始,第 i 塊區域下陷的深度為 di 春春每天可以選擇一段連續區間 l,r 填充這段區間中的每塊區域,讓其下陷深 度減少 1。在選擇區間時,需要保證,區間內的每塊...

比賽 NOIP2018 鋪設道路

原題,而且還是ccf自己的 考慮對於一段最長不上公升序列,無論如何都至少有序列第乙個數的貢獻,可以知道,這個貢獻是可以做到且最少的 然後對於序列最後一位,也就是最小的那乙個數,可以和後面序列拼起來的就拼起來,所以後面的序列需要補償的貢獻就是差分 簡化一下,ans sum n max include ...