在一个非降序列中,查找与给定值最接近的元素。
Input
第一行包含一个整数n,为非降序列长度。1 <= n <= 100000。
第二行包含n个整数,为非降序列各元素。所有元素的大小均在0-1,000,000,000之间。
第三行包含一个整数m,为要询问的给定值个数。1 <= m <= 10000。
接下来m行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在0-1,000,000,000之间。
Output
m行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。若有多个值满足条件,输出最小的一个。
Sample Input
3
2 5 8
2
10
5
Sample Output
8
5
题解:
这题一看就是用二分来解决
代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;
ll a[100005];
int main() {
std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
ll n;
cin >> n;
for (ll i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n);
int m;
cin >> m;
while (m--) {
int ans = 0;
ll q;
cin >> q;
ll i = 0;
ll j = n - 1;
ll flags = 0;
while (i <= j) {
ll mid = i + ((j - i) >> 1);
if (a[mid] == q) {
i = mid;
break;
}
else if (q < a[mid]) {
j = mid - 1;
continue;
}
else {
i = mid + 1;
continue;
}
break;
}
if (j< 0) {
j=i;
}
if (i > n - 1) {
i = j;
}
if (abs(a[i] - q) < abs(a[j] - q)) {
cout << a[i] << endl;
}
else {
cout << a[j] << endl;
}
}
return 0;
}