[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;
}