B - Suffix Operations
题意: 给出一个数组,刚开始可以选择其中一个数变成任意的数,然后只能对数组的后缀进行加1或者减1的操作,问最少经过多少次操作才能把数组中的所有元素都变成一样的。
题解: 脑子不够用,这道题真的是想了很久了。先不考虑将数字进行变换,那么答案就很明显是一个差分数组的和,然后考虑变换。
- 如果变换第一个数字,那么减少的操作次数就是 a b s ( a [ 1 ] − a [ 2 ] ) abs(a[1] - a[2]) abs(a[1]−a[2])
- 如果变换最后一个数字,那么减少的操作次数就是 a b s ( a [ n ] − a [ n − 1 ] ) abs(a[n] - a[n - 1]) abs(a[n]−a[n−1])
- 如果变换中间的数字,那么减少的操作次数就是 a b s ( a [ i ] − a [ i − 1 ] ) + a b s ( a [ i ] − a [ i + 1 ] ) − a b s ( a [ i + 1 ] − a [ i − 1 ] ) abs(a[i] - a[i - 1]) + abs(a[i] - a[i + 1]) -abs(a[i + 1] - a[i - 1]) abs(a[i]−a[i−1])+abs(a[i]−a[i+1])−abs(a[i+1]−a[i−1])
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 2e5 + 10;
int t, n;
ll a[maxn];
void solve() {
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%lld", &a[i]);
ll result = 0;
for(int i = 1; i < n; i++)
result += abs(a[i + 1] - a[i]);
ll maxx = -1;
maxx = max(maxx, max(abs(a[1] - a[2]), abs(a[n] - a[n - 1])));
for(int i = 2; i < n; i++) {
maxx = max(maxx, -abs(a[i + 1] - a[i - 1]) + abs(a[i] - a[i - 1]) + abs(a[i] - a[i + 1]));
}
printf("%lld\n", result - maxx);
}
int main() {
scanf("%d", &t);
while(t--)
solve();
return 0;
}