D1T1:铺设道路
回忆NOIP2013D2T1 积木大赛,发现这两题唯一的区别就是一个是造山一个是填坑,而把填坑的操作反序就是造山,所以可以直接使用那道题的方法。
具体方法是,从左到右每次考虑新的一列,若这一列的坑比左边一列浅,那么可以在填左边一列的时候顺便填好这个坑(只要把所有右端点为i-1的操作右端点全部改为i即可),不需要任何操作。若这一列的坑比左边深,那么就必须先将这一列的坑填到与左边平齐,再让左边的操作顺带把这个坑填平。
于是有:若a[i]<=a[i-1],ans不变,否则ans+=a[i]-a[i-1]。
期望得分:100
复杂度:$O(n)$
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #define rep(i,l,r) for (int i=(l); i<=(r); i++) 5 using namespace std; 6 7 const int N=100010; 8 int n,ans,a[N]; 9 10 int main(){ 11 freopen("road.in","r",stdin); 12 freopen("road.out","w",stdout); 13 scanf("%d",&n); 14 rep(i,1,n){ 15 scanf("%d",&a[i]); 16 if (a[i]>a[i-1]) ans+=a[i]-a[i-1]; 17 } 18 printf("%d\n",ans); 19 return 0; 20 }