输入说明
第一行包含一个整数n,为非降序列长度。1 ≤ n ≤ 100000。 第二行包含n个整数,为非降序列各元素。所有元素的大小均在0-1,000,000,000之间。 第三行包含一个整数m,为要询问的给定值个数。1 ≤ m ≤ 10000。 接下来m行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在0-1,000,000,000之间。
输出说明
输出m行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。若有多个值满足条件,输出最小的一个。
//因为经典二分法对中位+1或-1的处理可能会跳过原本最接近的中位,因此直接传入中位
#include<iostream>
using namespace std;
int main()
{
int f(int mn,int mx,int a,int p[]);
int n;
cin>>n;
int p[n+1];
for(int i=1;i<=n;i++)
cin>>p[i];
int m;
cin>>m;
int q[m+1];
for(int i=1;i<=m;i++)
cin>>q[i];
for(int i=1;i<=m;i++)
{
cout<<F(1,n,q[i],p)<<endl;
}
}
int f(int mn,int mx,int a,int p[])
{
if(a>=p[mx])
return p[mx];
else if(a<=p[mn])
return p[mn];
if(mx-mn==1)
{
int t1=a-p[mn],t2=p[mx]-a;
if(t1>t2)
return p[mx];
else //(t1<=t2)
return p[mn];
}
else
{
int mid=(mn+mx)/2;
if(a>p[mid])
return F(mid,mx,a,p);
else if(a<p[mid])
return F(mn,mid,a,p);
else
return p[mid];
}
}