港口(差分數組)

港口(差分數組)

傳送門

思路:因爲是區間加減,所以考慮差分數組,題意變爲:要求差分數組d[2],d[3]d[n]d[2],d[3]\dots d[n]全爲0.每次區間加或減會使差分數組一個加1,一個減1,因爲要用最小次數,所以每次操作最好產生有效貢獻,可知當爲正數或負數的差分數組變爲0後,剩下我們可以用區間[1,r][1,r]加減1實現對一個差分數組加減1.

因此根據貪心得到 :ans=max(d[i],d[i])ans=max(\sum d[i]_{正},\sum d[i]_負)

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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章