港口(差分數組)
思路:因爲是區間加減,所以考慮差分數組,題意變爲:要求差分數組全爲0.每次區間加或減會使差分數組一個加1,一個減1,因爲要用最小次數,所以每次操作最好產生有效貢獻,可知當爲正數或負數的差分數組變爲0後,剩下我們可以用區間加減1實現對一個差分數組加減1.
因此根據貪心得到 :
AC代碼:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
#define mst(a) memset(a,0,sizeof a)
ll a[N];
int main(){
int n;
ll x;
scanf("%d%lld",&n,&x);
ll ans1=0,ans2=0,pre=x;
for(int i=2;i<=n;i++){
scanf("%d",&x);
if(x>pre) ans1+=x-pre;
else ans2+=pre-x;
pre=x;
}
printf("%lld\n",max(ans1,ans2));
return 0;
}