题意
对一个数组每次可以进行以下三种操作之一:
1.选择区间
[
1
,
i
]
[1,i]
[1,i] 之间的所有数
−
1
-1
−1
2.选择区间
[
i
,
n
]
[i,n]
[i,n] 之间的所有数
−
1
-1
−1
3.对整个数组中的所有数
+
1
+1
+1
求使整个数组变为 0 0 0 的最少操作次数
经典差分操作:连续区间加减同样的数,因此直接构造差分数组
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int a[N];
void solve(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=n;i>=2;i--)
a[i]-=a[i-1];
int ans=0;
for(int i=2;i<=n;i++){
if(a[i]>0)
ans+=a[i];
else if(a[i]<0)
a[1]+=a[i],ans+=-a[i];
}
ans+=abs(a[1]);
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0);
int T;
cin>>T;
while(T--)
solve();
return 0;
}