春春幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为 nn 的大厦,大厦可以看成由 nn 块宽度为 11 的积木组成,第 ii 块积木的最终高度需要是 h_ih
i
。
在搭建开始之前,没有任何积木(可以看成块高度为 00 的积木)。接下来每次操作,小朋友们可以选择一段连续区间 [L,R][L,R],然后将第 LL 块到第 RR 块之间(含第 LL 块和第 RR 块)所有积木的高度分别增加 11。
小 M 是个聪明的小朋友,她很快想出了建造大厦的最佳策略,使得建造所需的操作次数最少。但她不是一个勤于动手的孩子,所以想请你帮忙实现这个策略,并求出最少的操作次数。
输入格式
输入包含两行,第一行包含一个整数 nn,表示大厦的宽度。
输出格式
仅一行,即建造所需的最少操作数。
数据范围
对于 3030% 的数据,有 1 \le n \le 101≤n≤10;
对于 7070% 的数据,有 1 \le n \le 10001≤n≤1000;
对于 100100% 的数据,有 1 \le n \le 1000001≤n≤100000,0 \le h_i \le 100000≤h
i
≤10000。
样例说明
其中一种可行的最佳方案,依次选择 [1,5][1,5]、[1,3][1,3]、[2,3][2,3]、[3,3][3,3]、[5,5][5,5]。
输出时每行末尾的多余空格,不影响答案正确性
样例输入复制
5
2 3 4 1 2
样例输出复制
5
我们假设宽度为1,那么盖楼的次数就是高度,那么如果宽度为2,如果前面的和后面一样高,那么就只需要同样的次数,如果前面的高于后面,那么就等于前面,如果后面高于前面,那么就为后面的,同时,如果两个高的中间有一个矮的,那么就会将前后分隔,故而就需要前后独立计算,并且中间矮的那个肯定在之前的次数中就已经被填过了,而后面的因为中间的阻隔就没有被填过,所以就是一个贪心,代码如下:
//@author:hairu,wu
//@from:ahut
#include<iostream>
using namespace std;
int a[100100];
int main(){
int n;
cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
}
int now=a[1];
int ans=a[1];
for(int i=2;i<=n;i++){
if(a[i]>now){
ans+=a[i]-now;
}
now=a[i];
}
cout<<ans<<endl;
return 0;
}