洛谷P1969 积木大赛
贪心
考虑差分
对区间 [l,r]+1 在差分数组上相当于 d[ l ]++ ; d[ r+1 ]-- ;
那么你得到原数组的差分数组后
当d[ i ] = x 则你需要 对 以 i 为左端点 右端点未知的一个区间加x次
且这x加的可能不是同一个区间
所以最后只要将差分数组中所有正数加上去就行了
同样其实也可以用负数算的,但是负数算的话,要加上 d[ n+1 ] 即 a[ n+1 ] - a[ n ]
或者另一种思路
对于一段上升(不下降)区间,我们在搭最高层时可以把下面一起搭了
而如果这个区间开始下降,那么我们进入另一个区间,这个上升区间中
的最小值以下部分都可以在上个区间搭完,所以他的消耗就是本区间最大减最小(第一段减0)
复杂度O(n) 啦啦啦
1 #include <cstdio> 2 using namespace std ; 3 4 const int N = 100011 ; 5 int n,sum ; 6 int a[N] ; 7 8 int main() 9 { 10 scanf("%d",&n) ; 11 for(int i=1;i<=n;i++) scanf("%d",&a[ i ]) ; 12 for(int i=1;i<=n;i++) if(a[ i ]-a[i-1]>0) sum+=a[ i ] - a[ i-1 ] ; 13 printf("%d\n",sum) ; 14 return 0 ; 15 }
时间: 2024-11-07 11:11:36