题目链接
题解:
这个题需要通过二分来找到接近他的数,假如我们现在要找最接近X的数,但是我们只能找到小于等于他的数,如果这个数在数组的下标为 i,a[i]==X,就是最终结果,否则,就要比较a[i]减X差的绝对值,和a[i+1]减X的绝对值。a[i]<X<a[i+1]。
代码:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAX=1e9;
int a[100005],b[10005],n,m;
int bs(int x)
{
int l=0,r=n;
while(l<r){
int mid=l+(r-l)/2;
if(x<=a[mid])
r=mid;
else
l=mid+1;
}
return r;
}
int main()
{
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
scanf("%d",&m);
for(int i=0;i<m;i++)
{
scanf("%d",&b[i]);
if(b[i]<=a[0]){ // 如果输入的要查询的数小于非降序列的最小的数 就输出序列中最小的数
printf("%d\n",a[0]);
continue;
}
if(b[i]>=a[n-1]){ //同理输出序列中最大的数
printf("%d\n",a[n-1]);
continue;
}
int k=bs(b[i]);
if(a[k]==b[i]) //相等就直接输出
printf("%d\n",a[k]);
else{
k-=1;
if(abs(a[k]-b[i])<=abs(a[k+1]-b[i])) //比较差值
printf("%d\n",a[k]);
else
printf("%d\n",a[k+1]);
}
}
}
return 0;
}