[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

posted @ 2021-11-14 19:09  q0000000  阅读(41)  评论(0编辑  收藏  举报