题意:
在一个非降序列中,查找与蒜头君的给定值最接近的元素。
限制条件
1 <= n <= 100,000 (序列元素个数)
1 <= m <= 10,000 (询问次数)
0 <=
X
i
X_i
Xi <= 1,000,000,000 (序列元素和给定元素范围)
思路
二分+特判。可以通过lower_bound函数在序列中找到比给定数值大于或者等于的第一个数的下标,从而找到的下标前一个数如果存在那么一定是小于给定数值,由于序列为非降序列,那么最接近给定值的元素一定是第一个大于或者等于该元素的值和小于该元素的最大值中的一个。
AC代码如下:
#include "bits/stdc++.h"
using namespace std;
const int N = 1e5 + 10;
int a[N];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
int m;
cin >> m;
while (m--) {
int num;
cin >> num;
int idx = lower_bound(a, a + n, num) - a;
int ans;
/// 系列中所有元素都小于给定值,则序列最后一个元素最接近给定值
/// 系列中所有元素都大于或者等于给定值,则序列第一个元素最接近给定值
/// 其他情况为系列中既有大于或者等于给定值的元素,也有小于给定值的元素,
/// 则判定最接近给定值的前一个元素或者后一个元素的距离来确定,距离更小的就是最接近的
if (idx == n) ans = a[n - 1];
else if (idx == 0) ans = a[idx];
else if (abs(a[idx - 1] - num) > abs(a[idx] - num)) ans = a[idx];
else ans = a[idx - 1];
cout << ans << "\n";
}
return 0;
}