NOI的1.1的01:查找最接近的元素代码错了不知道怎么修改

NOI的1.1的01:查找最接近的元素代码错了不知道怎么修改
原题在http://noi.openjudge.cn/ch0111/01/
二分查找函数怎么写啊,怎么才能得到最接近元素的下标

#include
#include
using namespace std;
int bi_search(int n,int a[],int t){
    int left=0,right=t,res=-1,mid,min=0;
    if(a[t]<=n) res=t;
    else if(a[0]>=n) res=0;
    else {
        while(left<=right){
            mid=(right+left)/2;
            if(a[mid]==n) {res=mid;break;}
            else if(a[mid]>n) right=mid-1;
            else left=mid+1;
        }
        res=mid;
    }
    return res;
}
int main(){
    int n,i,l,a[100010],m,b[100010],t,e;
    cin>>n;
    for(i=0;i<n;i++) cin>>a[i];
    t=i-1;
    cin>>m;
    for(i=0;i>b[i];
    for(i=0;it);
        cout<

代码中n是数组长度,t是需要查找的数,你的bi_search函数中逻辑错了。
平台测试已通过:

img

代码修改如下:

#include <iostream>
#include <math.h>
using namespace std;

//非降序数列二分法查找
int bi_search(int n, int a[], int t) {
    int mid, left, right;
    if (t <= a[0]) return a[0];
    else if (t >= a[n - 1]) return a[n-1];

    left = 0;
    right = n - 1;
    mid = n / 2;

    while (1)
    {
        if (a[mid] == t) return a[mid];
        if (a[mid - 1] == t) return a[mid - 1];
        if (a[mid - 1] < t && t < a[mid])
        {
            if ((a[mid] - t) < (t - a[mid - 1]))
                return a[mid];
            else
                return a[mid - 1];
        }
        else
        {
            if (t < a[mid - 1])
            {
                left = left;
                right = mid - 1;
            }
            else
            {
                left = mid;
                right = right;
            }
            mid = left + (right - left + 1) / 2;
        }
    }
}
int main() {
    int n, i, a[100010], m, b[10002],e;
    cin >> n;
    for (i = 0; i < n; i++) 
        cin >> a[i];
    cin >> m;
    for (i = 0; i < m; i++) 
        cin >> b[i];
    for (i = 0; i < m; i++) {
        e = bi_search(n, a, b[i]);
        cout << e << endl;
       
    }
    return 0;
}


你这是找相同的数的二分法,但题目是找最接近的。因此需要在比较的过程中,记录搜索值与比较过的值的差值,找出差最小的

#include<iostream>
#include<math.h>
using namespace std;
int bi_search(int n,int a[],int t){
    int left=0,right=t,res=left,dif = abs(t-a[left]),mid,min=0;
    if(a[t]<=n) res=t;
    else if(a[0]>=n) res=0;
    else 
    {
        while(left<=right)
        {
            mid=(right+left)/2;
            
            if(a[mid]==n) 
            {
                res=mid;
                dif =0;
                break;
            }
            else 
            {
                if(abs(a[mid] - a[res]) < dif)
                {
                    dif = abs(a[mid] - a[res]);
                    res = mid;
                }
                else if(abs(a[mid]-a[res]) == dif)
                {
                    if(mid < res)
                        res = mid;
                }
                if(a[mid]>n) 
                    right=mid-1;
                else 
                    left=mid+1;
            }

        }
    }
    return res;
}
int main(){
    int n,i,l,a[100010],m,b[100010],t,e;
    cin>>n;
    for(i=0;i<n;i++) cin>>a[i];
    t=i-1;
    cin>>m;
    for(i=0;i<m;i++) cin>>b[i];
    for(i=0;i<m;i++){
        e=bi_search(b[i],a,t);
        cout<<a[e]<<endl;
    }
    return 0;
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632