铺设道路
题目
春春是一名道路工程师,负责铺设一条长度为 n 的道路。
铺设道路的主要工作是填平下陷的地表。整段道路可以看作是 n 块首尾相连的区域,
一开始,第 i 块区域下陷的深度为 \(d_i\) 。
春春每天可以选择一段连续区间L,R ,填充这段区间中的每块区域,
让其下陷深度减少 1。在选择区间时,
需要保证,区间内的每块区域在填充前下陷深度均不为 0 。
春春希望你能帮他设计一种方案,可以在最短的时间内将整段道路的下陷深度都变为 0 。
input
输入文件包含两行,第一行包含一个整数 n,表示道路的长度。
第二行包含 n个整数,相邻两数间用一个空格隔开,第 i 个整数为 d_i。
n<=100000,d_i<=10000
output
最少需要多少天才能完成任务。
输入样例
input
6
4 3 2 5 3 5
output
9
思路
找最少天数,对于输入的每段凹陷深度,当d[i]>d[i-1]时,随前面的填平,d[i]随之改变,当d[i-1]变为0,只要再增加d[i]-d[i-1]天即可。
当d[i]<d[i-1]时,d[i]填平之前,d[i-1]提前填平,天数并不增加,d[i-1]=0后,即为断点,后续d[i]与d[i-1]的关系将引起新的天数增加
局部最优能达到整体最优
代码
#include<iostream>
using namespace std;
#define lenth 100002
int main()
{
int n,day=0;
int d[lenth];
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>d[i];
if(d[i]>d[i-1])
day=day+d[i]-d[i-1];
}
cout<<day;
return 0;
}