题目
题意:给定一组石堆,每次操作:选择下标
1
<
=
i
<
j
<
k
<
=
n
,
a
j
>
=
2
1<=i<j<k<=n,a_j>=2
1<=i<j<k<=n,aj>=2,从
a
j
a_j
aj从挑取两个石头,分别放进
a
i
,
a
k
a_i,a_k
ai,ak。问最终能否使所有石头都丢进
a
1
,
a
n
a_1,a_n
a1,an中。
思路:保证 a 2 , . . . , a n − 1 a_2,...,a_{n-1} a2,...,an−1有一个大于1的数即可。特判,n=3时, a 2 a_2 a2要为偶数。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 200010;
int t;
int a[maxn], n;
void solve() {
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
ll ans = -1;
for (int i = 1; i < n - 1; ++i) {
if (a[i] > 1) {
ans = 0;
}
}
if (ans == -1 || (n == 3 && (a[1] & 1))) {
printf("-1\n");
return;
}
for (int i = 1; i < n - 1; ++i) {
ans += (a[i] + 1) / 2;
}
printf("%lld\n", ans);
}
int main() {
scanf("%d", &t);
while (t--) {
solve();
}
}