[NOIP2018 提高組]鋪設道路(貪心)
阿新 • • 發佈:2021-11-14
一個一時間沒想到的小貪心……(雙倍經驗,逃
。
這道題和 NOIP2013 積木大賽一模一樣——你可以用其中一道題的 AC 程式碼 AC 另一道。
發現對於一個下降段 \(a\),我們要把它填平,需要其最大值 \(a_{\max}\) 次;如果在最後加了一個上升,例如在 4 3 2
後面加一個變成 4 3 2 5
,我們就要多用 \(5-2=3\) 次;如果在這後面繼續下降,比方說 4 3 2 5 4 3 2 1
,我們仍然不需要更多步操作,因為填平 5
的那 \(3\) 步早已順帶著把後面的填平了。
這個貪心看起來就很對。實現上,只需要從 \(2\) 到 \(n\) 列舉每個位置,如果 \(a_i>a_{i-1}\),就把答案加上 \(a_i-a_{i-1}\)
下面是 AC 程式碼:
int main(){
int n; scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
int ans=a[1];
for(int i=2;i<=n;++i)
if(a[i]>a[i-1]) ans+=a[i]-a[i-1];
printf("%d\n",ans);
return 0;
}