分析
有序只跟相邻两个数有关所以只需考虑相邻的两个数。
接下来分类讨论:
- 如果 a i < a i + 1 a_i < a_{i+1} ai<ai+1,如果要让 ∣ a i − x ∣ ≤ ∣ a i + 1 − x ∣ | a_i-x| \le |a_{i+1}-x| ∣ai−x∣≤∣ai+1−x∣,则 0 ≤ x ≤ ⌊ a i + a i + 1 ⌋ 2 0\le x\le\frac{\lfloor a_i+a_{i+1} \rfloor}{2} 0≤x≤2⌊ai+ai+1⌋。
- 如果 a i > a i + 1 a_i > a_{i+1} ai>ai+1,如果要让 ∣ a i − x ∣ ≤ ∣ a i + 1 − x ∣ | a_i-x| \le |a_{i+1}-x| ∣ai−x∣≤∣ai+1−x∣,则 x ≥ ⌈ a i + a i + 1 ⌉ 2 x\ge\frac{\lceil a_i+a_{i+1} \rceil}{2} x≥2⌈ai+ai+1⌉。
- 如果 a i = a i + 1 a_i = a_{i+1} ai=ai+1,无论 x x x 取何值,都满足条件。所以 x x x 任取何值都可行。
然后遍历数组 a a a,计算每个数的 x x x 的范围,如果有交集则输出交集内任意一数,否则无解。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 2 * 1e5 + 5;
int T, n, a[N];
int main(){
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
for(cin >> T; T; T --){
cin >> n;
int l = 0, r = 1e9;
for(int i = 1; i <= n; i ++){
cin >> a[i];
}
for(int i = 1; i < n; i ++){
if(a[i] > a[i + 1]){
l = max(l, (a[i] + a[i + 1] + 1) / 2);
}if(a[i] < a[i + 1]){
r = min(r, (a[i] + a[i + 1]) / 2);
}
}
if(l > r){
cout << "-1\n";
}else{
cout << l << "\n";
}
}
return 0;
}