CF1772D 题解

文章讲述了如何在有序数组中找到满足绝对差值限制的整数x的可能取值范围,通过分类讨论不同情况并计算范围,最后给出代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

洛谷题目链接

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 <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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值