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
我是这样想的:
用二分查找寻找最接近的元素,然后没寻找一次,就把结果存起来。
如果这个二分查找的此时值与带查找的值相同,就直接返回。如果不相同,就把这一次的查找值和上一次的查找值相比较,如果只一次比上一次更接近待查找的值,就把这一次的下标值保存下来,只到程序退出(如果是第一次二分查找,则直接保存下标值)。
代码如下:
#include<stdio.h>
int p[100005];
int main()
{
int m,n;
int i;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&p[i]);
scanf("%d",&m);
while(m--)
{
scanf("%d",&i);
int left,right,mid,mad=-1;
left=1;right=n;
while(left<=right)
{
mid=left+(right-left)/2;
if(mad==-1||abs(i-p[mid])<abs(i-p[mad])||i-p[mid]==0)
mad=mid;
if((mad==-1)||(abs(i-p[mid])==abs(i-p[mad])&&mid<mad)||i-p[mid]==0)
mad=mid;
if(i==p[mid]) break;
if(i<p[mid]) right=mid-1;
else left=mid+1;
}
printf("%d\n",p[mad]);
}
return 0;
}