小蓝在无聊时随机生成了一个长度为 nn 的整数数组,数组中的第 ii 个数为 aiai,他觉得随机生成的数组不太美观,想把它变成回文数组,也是就对于任意 i∈[1,n]i∈[1,n] 满足 ai=an−i+1ai=an−i+1。小蓝一次操作可以指定相邻的两个数,将它们一起加 11 或减 11;也可以只指定一个数加 11 或减 11,请问他最少需要操作多少次能把这个数组变成回文数组?
输入格式
输入的第一行包含一个正整数 nn 。
第二行包含 nn 个整数 a1,a2,⋯,ana1,a2,⋯,an,相邻整数之间使用一个空格分隔。
输出格式
输出一行包含一个整数表示答案。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n / 2; i++)
b[i] = a[i] - a[n - i + 1];
long long res = 0;
for (int i = 2; i <= n / 2; i++) {
if (1LL * b[i] * b[i - 1] > 0) { // 同号
int x = min(abs(b[i]), abs(b[i - 1]));
res += x;
if (b[i] < 0) {
b[i] += x;
b[i - 1] += x;
} else {
b[i] -= x;
b[i - 1] -= x;
}
}
}
for (int i = 1; i <= n / 2; i++)
res += abs(b[i]);
cout << res << '\n';
return 0;
}