問題解決のアイデア:逆思考:各ビルディングブロックの高さが与えられていると仮定すると、特定の間隔内のすべての高さを毎回1ずつ減らすことができ、すべての高さを0にするための最小操作回数を求めることができます。
差分シーケンスb [1]、b [2]、...、b [n]を取得し、後ろから前にスキャンして正の数に遭遇します。これは、連続区間の左臨界に現在到達していることを示します。間隔の右マージンを示すには、整数の後の負の数でなければなりません。整数プラス1、負の数マイナス1、差分シーケンスが0になるまで
操作の数は、差分シーケンスの整数の合計です。
#include<iostream>
using namespace std;
#include<queue>
int n;
int sum;
int h[100005];
int b[100005];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d",&h[i]);
b[i]=h[i]-h[i-1];
// cout<<b[i]<<" ";
if(b[i]>0)
sum=sum+b[i];
}
cout<<sum;
return 0;
}