救救兔子
方法1
#include<stdio.h>
#include<algorithm>
using namespace std;
int arr[100005];
int n, m, x;
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
sort(arr, arr + n);
scanf("%d", &m);
while (m--) {
scanf("%d", &x);
int index = lower_bound(arr, arr + n, x) - arr;
int ans;
if (index == 0)ans = arr[0];
else if (index == n)ans = arr[n - 1];
else ans = (abs(arr[index] - x) < abs(arr[index - 1] - x)) ? arr[index] : arr[index - 1];
printf("%d\n", ans);
}
return 0;
}
方法2
#include<stdio.h>
#include<algorithm>
using namespace std;
int arr[100005];
int n, m, x;
int search() {
int begin = 0, end = n - 1;
// 预处理两个端点
if (x <= arr[0])return arr[0];
if (x >= arr[n - 1])return arr[n - 1];
// 该过程中,数组总是能够找到大于或者小于x的值
while (begin <= end) {
int mid = (begin + end) / 2;
if (arr[mid] == x) {
return x;
}
if (arr[mid] < x) {
begin = mid + 1;
}
else {
end = mid - 1;
}
}
return (arr[begin] - x) < (x - arr[end]) ? arr[begin] : arr[end];
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
sort(arr, arr + n);
scanf("%d", &m);
while (m--) {
scanf("%d", &x);
int ans = search();
printf("%d\n", ans);
}
return 0;
}