题目
题意:有n个数
a
a
a,每次选择选择相邻的数,同时减一。问进行若干次操作后,能否让所有数都相同且非负。如果能达到输出需要减去的总数,否则输出-1。
思路:从左到右,出现不同的,则针对大的一边,做减法,尝试使其持平。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100010;
#define ll long long
int n;
int a[maxn], h[maxn];
void solve() {
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
h[i] = a[i];
}
bool flag = 1;
for (int i = 0; i < n - 1; ++i) {
if (a[i] < 0) {
flag = 0;
break;
}
if (a[i] > a[i+1]) {
if (i % 2 == 0) {// 确保前面的数能配对
flag = 0;
break;
}
a[i] = a[i+1];
} else if (a[i] < a[i+1]) {
if (i + 2 >= n) {// 确保后边有一个数配对
flag = 0;
break;
}
int tmp = a[i+1] - a[i];
a[i+1] = a[i];
if (a[i+2] < tmp) {// 确保减后非负
flag = 0;
break;
}
a[i+2] -= tmp;
}
}
if (!flag) {
printf("-1\n");
return;
}
int v = a[n-1];
ll res = 0;
for (int i = 0; i < n; ++i) {
res += h[i] - v;
}
printf("%lld\n", res);
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
solve();
}
}