4134:查找最接近的元素(二分查找)

 

总时间限制: 
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 <bits/stdc++.h>
using namespace std;

int a[100005],d,n,k;
int BinarySearch(int left,int right) {
    int mid;
    while(left<=right) {
        mid=left+(right-left)/2;
        if(a[mid]==d)return a[mid];
        else if(a[mid]<d)left=mid+1;
        else right=mid-1;
    }
    if(left==0)return a[left];
    else
        return abs(a[left]-d)<abs(a[left-1]-d)?a[left]:a[left-1];
}
int main() {
    scanf("%d",&n);
    for(int i=0; i<n; i++)scanf("%d",&a[i]);
    scanf("%d",&k);
    while(k>0) {
        scanf("%d",&d);
        printf("%d\n",BinarySearch(0,n-1));
        k--;
    }
}

 

posted @ 2020-03-27 16:16  瓜瓜爱呱呱  阅读(1089)  评论(1)    收藏  举报