在一个非降序列中,查找与蒜头君的给定值最接近的元素。
输入格式
第一行包含一个整数 n,为非降序列长度。1≤n≤100000。
第二行包含 n 个整数,为非降序列各元素。所有元素的大小均在 0∼1,000,000,0000∼1,000,000,000 之间。
第三行包含一个整数 m,为要询问的给定值个数。1≤m≤10000。
接下来 m 行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在 0∼1,000,000,0000∼1,000,000,000 之间。
输出格式
m 行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。若有多个值满足条件,输出最小的一个。
样例输入:
3 2 5 8 2 10 5
样例输出:
8 5
参考答案:
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int N=1e5+5;
LL a[N],n,m;
LL Bin_Search(LL x)
{
int l=0,r=n-1;
if(x>=a[r])
return a[r];
if(x<=a[l]) return a[l];
while(r-l>1)
{
int mid = (l + r) / 2;
if(x <= a[mid])
r = mid;//因为要求最接近x的数则r不需要加1,因为r=mid可能就是最接近的数
else
l = mid;
}
LL p=abs(a[r]-x);
LL q=abs(a[l]-x);
return q<=p?a[l]:a[r];//一定要是q<=p的时候输出左边的数a[l]
//如果p<=q?a[r]:a[l],当p==q时正确答案应输出更小的a[l],但这样写会先输出a[r]
}
signed main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
cin>>m;
while(m--)
{
LL x;cin>>x;
cout<<Bin_Search(x)<<endl;
}
}