CF1772D 题解

洛谷题目链接

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| aixai+1x,则 0 ≤ x ≤ ⌊ a i + a i + 1 ⌋ 2 0\le x\le\frac{\lfloor a_i+a_{i+1} \rfloor}{2} 0x2ai+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| aixai+1x,则 x ≥ ⌈ a i + a i + 1 ⌉ 2 x\ge\frac{\lceil a_i+a_{i+1} \rceil}{2} x2ai+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 

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;
}

你可能感兴趣的:(c++,算法)