问题 1904 --查找最接近的元素

1904: 查找最接近的元素★★★

时间限制: 1 Sec  内存限制: 128 MB
提交: 1180  解决: 539
[提交][状态][命题人:]

题目描述

在一个非降序列中,查找与给定值最接近的元素。

#include <iostream>
#include <cstdio>
using namespace std;
int a[114514],n,x,l,h,m,s;
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%d",&a[i]);
    scanf("%d",&x);
    while(x--)
    {
        scanf("%d",&s);
        if(s<=a[0]) 
		{
			_____(1)_______;
			continue;
		}
        if(s>=a[n-1]) 
		{
			printf("%d\n",a[n-1]);
			continue;
		}
        h=n-1;
        l=0;
        while(l<=h)
        {
            m=(h+l)/2;
            if(s==a[m])
                ______(2)_____;
            else if(s>a[m])
            	l=m+1;
            else if(s<a[m])
            	______(3)_____;
        }
        if(______(4)______)
        	printf("%d\n",s);
		else if(a[l]-s<s-a[h])
			printf("%d\n",a[l]);
		else
			printf("%d\n",a[h]);
    }     
}

输入

第一行包含一个整数n,为非降序列长度。1 ≤ n ≤ 100000。

第二行包含n个整数,为非降序列各元素。所有元素的大小均在0-1,000,000,000之间。

第三行包含一个整数m,为要询问的给定值个数。1 ≤ m ≤ 10000。

接下来m行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在0-1,000,000,000之间。

输出

m行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。若有多个值满足条件,输出最小的一个。

样例输入
Copy
3
2 5 8
2
10
5
样例输出
Copy
8
5

提示

来源

 

[提交][状态]