01:查找最接近的元素
总时间限制:
- 1000ms
内存限制:- 65536kB
描述
- 输入
在一个非降序列中,查找与给定值最接近的元素。
- 第一行包含一个整数n,为非降序列长度。1 <= n <= 100000。 第二行包含n个整数,为非降序列各元素。所有元素的大小均在0-1,000,000,000之间。 第三行包含一个整数m,为要询问的给定值个数。1 <= m <= 10000。 接下来m行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在0-1,000,000,000之间。
输出- m行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。若有多个值满足条件,输出最小的一个。
样例输入- 样例输出
3 2 5 8 2 10 5 8 5
//二分查找函数版本1
/*写一个函数,在包含size个元素的,从小到大排序的int数组a中查找
元素p,如果找到,返回元素下标,如果找不到,则返回-1,要求复杂
O(log(n))*/
int BinarySearch(int a[],int size,int p){
int L=0,R=size-1;
while(l<=R){
int mid=L+(R-L)/2;
if(p==a[mid])return mid;
else if(p<a[mid]){
R=mid-1;
}
else if(p>a[mid]){
L=mid+1;
}
}
return -1;
} //复杂度o(log(n))
//二分查找函数版本2
/*写一个函数LowerBound,在包含size个元素的,从小到大排序的int数组a里
查找比给定整数p小的,下标最大的元素,找到返回其下标,找不到返回-1*/
int LowerBound(int a[],int size,int p){//复杂度O(log(n))
int L=0,R=size-1;
int lastPos=-1;//到目前为止找到的最优解
while(L<=R){//如果查找区间不为空就继续查找
int mid=L+(R-L)/2;
if(p<=a[mid]){
R=mid-1;
}
else{
lastPos=mid;
L=mid+1;
}
}
return lastpos;
}
#include <bits/stdc++.h>
using namespace std;
#define MAXN (100100)
int num[MAXN];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;++i)
cin>>num[i];
int m;
cin>>m;
while(m--){
int x,ans;
cin>>x;
int l=1,r=n,mid;
if(x<=num[1]){
cout<<num[1]<<endl;
continue;
}
if(x>=num[n]){
cout<<num[n]<<endl;
continue;
}
while(l<=r){
mid=(l+r)>>1;
if(num[mid]<=x){
l=mid+1;
}
else r=mid-1;
}
if(abs(num[l]-x)<abs(num[r]-x))
ans=l;
else ans =r;
cout<<num[ans]<<endl;
}
return 0;
}