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 }
road

相关文章:

  • 2022-03-06
  • 2019-06-22
  • 2021-12-15
  • 2021-06-15
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-08-23
  • 2021-07-07
  • 2021-09-13
  • 2022-03-03
相关资源
相似解决方案