[二分法]求解递增序列中与x最接近元素问题

 

题目描述

在一个非降序列序列中与给定值 x 最接近的元素

输入描述

第一行包含一个整数 n,为非降序列长度 (1<=n<=100 000)

第 2 行包含 n 个整数,为非降序列的各个元素, 所有元素的大小均在 0~1 000 000 000 范围内。

第 3 行包含一个整数 m, 为要询问的给定值的个数 (1<=m<=10 000)。接下来 m 行,每行一个整数, 为要询问最接近元素的给定值,所有给定值的大小均在 0~1 000 000 000 范围内。

输出描述

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

输入样例

Copy to Clipboard
3
2 5 8
2
10
5

输出样例

Copy to Clipboard
8
5
//已过OJ

#include <iostream>
using namespace std;

int main(){
    int i,mid,m,n,ask;
    int a[100000];
    cin>>n;
    for(i=1;i<=n;i++){
        cin>>a[i];
    }
    cin>>m;
    for(i=1;i<=m;i++){
        cin>>ask;
        if(ask<a[1]){
            cout<<a[1]<<endl;
            continue;
        }
        if(ask>a[n]){
            cout<<a[n]<<endl;
            continue;
        }
        int l=1,r=n;
        while(l<r){
            mid=(l+r)/2;
            if(a[mid]>=ask)r=mid;
            else l = mid+1;
        }
        if(a[l]==ask||(a[l]-ask)<(ask-a[l-1])){
            cout<<a[l]<<endl;
        }
        else{
            cout<<a[l-1]<<endl;
        }

    }
    return 0;
}

 

posted @ 2022-04-01 13:41  Fordson  阅读(131)  评论(0)    收藏  举报