1. 程式人生 > 其它 >[NOIP2018 提高組]鋪設道路(貪心)

[NOIP2018 提高組]鋪設道路(貪心)

一個一時間沒想到的小貪心……(雙倍經驗,逃

這道題和 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;
}

THE END