#include<bits/stdc++.h>
using namespace std;
int a[100005],n;
void find(int x){
    int l=1,r=n;
    int mid;
    if(x>a[n]){
        cout<<a[n]<<endl;
        return;
    }
    if(x<a[1]){
        cout<<a[1]<<endl;
        return;
    }
    while(l<=r){
        if(a[mid]==x){
            cout<<a[mid]<<endl;
            return;
        }
        mid=(l+r)/2;
        if(a[mid]<x){
            l=mid+1;
        }else{
            r=mid-1;
        }
    }
    if(abs(a[l]-x)<abs(a[r]-x)){
        cout<<a[l]<<endl;
        return;
    }else{
        cout<<a[r]<<endl;
        return;
    }
}
int main(){
    
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    int m;
    cin>>m;
    for(int i=1;i<=m;i++){
        int x;
        cin>>x;
        find(x);
    }
    return 0;
}

2 条评论

  • @ 2026-6-28 7:28:00

    还有,如果我没看错的话,你的mid在第一次遍历二分while循环的时候还没取中间值就判断,但mid没有初始化,有可能是垃圾值,可能大于n甚至是负数,直接作为数组下标可能会RE吧?

  • @ 2026-6-28 7:18:41
    #include<bits/stdc++.h>
    using namespace std;
    int n,m,q,a[100001];
    int find(int t){
        int l=1,r=n;
        while(l<=r){
            int mid=(l+r)/2;
            if(a[mid]<t) l=mid+1;
            else if(a[mid]>=t) r=mid-1;
        }
        if(l<0||l>n) l=0;
        if(r<0||r>n) r=0;
        if(l==r&&r==0){
            if(t>a[n]) return a[n];
            else return a[1];
        }
        if(abs(t-a[l])==abs(t-a[r])) return min(a[l],a[r]);
        else if(abs(t-a[l])<abs(t-a[r])) return a[l];
        else return a[r];
    }
    int main(){
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        a[0]=INT_MAX;
        cin>>m;
        while(m--){
            cin>>q;
            cout<<find(q)<<"\n";
        }
        return 0;
    }
    

    更简洁,自己写的

    • 1

    信息

    ID
    241
    时间
    ms
    内存
    MiB
    难度
    2
    标签
    递交数
    317
    已通过
    84
    上传者