在一个非降序列中,查找与给定值最接近的元素。 输入 第一行包含一个整数 $n$,为非降序列长度。$1 \le n \le 100000$。第二行包含 $n$ 个整数,为非降序列各元素。所有元素的大小均在 $0 - 1000000000$ 之间。第三行包含一个整数 $m$,为要询问的给定值个数。$1 \le m \le 10000$。接下来 $m$ 行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在 $0 - 1000000000$ 之间。 输出 $m$ 行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。若有多个值满足条件,输出最小的一个。用c语言实现
时间: 2024-02-13 15:07:30 浏览: 363
以下是本人给出的一种 C 语言实现,使用了二分查找和双指针算法来优化查找过程,时间复杂度为 $O(m \log n)$。
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 100000
#define MAX_M 10000
int a[MAX_N];
int find_closest(int n, int x) {
int l = 0, r = n - 1;
while (l <= r) {
int mid = (l + r) / 2;
if (a[mid] == x) {
return mid;
} else if (a[mid] > x) {
r = mid - 1;
} else {
l = mid + 1;
}
}
if (r < 0) {
return 0;
} else if (l >= n) {
return n - 1;
} else {
return abs(a[l] - x) < abs(a[r] - x) ? l : r;
}
}
int main() {
int n, m;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
scanf("%d", &m);
for (int i = 0; i < m; i++) {
int x;
scanf("%d", &x);
int closest = find_closest(n, x);
printf("%d\n", a[closest]);
}
return 0;
}
```
阅读全文