[传送门]
op:
后缀 + 1 或者-1
选择一个数字,让他变为其他整数中的一个
求最小的操作次数
ans:
a,b,c三个数字
操作次数 abs(a - b) + abs(b - c)
总的操作次数s += abs();
b变为a,即a,a,c 那么操作次数 abs(a - c)
贡献 abs(a - b) + abs(b - c)- abs(a - c) ;
即求最大的贡献值
s - maxx即可
trips:
maxx
1.第一个数字变为第二个
2.倒数第二个变为最后一个
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
int t,n;
long long s,maxx,a[maxn];
int main(){
ios::sync_with_stdio(0);
cin >> t;
while(t--){
s = 0;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i];
}
maxx = abs(a[1] - a[2]);
for(int i = 1; i < n; i++){
s += abs(a[i] - a[i + 1]);
if(i != 1) maxx = max(maxx,abs(a[i - 1] - a[i]) + abs(a[i] - a[i + 1]) - abs(a[i - 1] - a[i + 1]));
}
maxx = max(maxx,abs(a[2] - a[1]));
maxx = max(maxx,abs(a[n - 1] - a[n]));
cout << s - maxx << endl;
}
return 0;
}