洛谷题目链接
vjudge题目链接
Codeforces题目链接
分析
有序只跟相邻两个数有关所以只需考虑相邻的两个数。
接下来分类讨论:
- 如果 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;
}