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

在一个非降序列中,查找与给定值最接近的元素
输入
第一行包含一个整数n,为非降序列长度。1 <= n <= 100000。
第二行包含n个整数,为非降序列各元素。所有元素的大小均在0-1,000,000,000之间。
第三行包含一个整数m,为要询问的给定值个数。1 <= m <= 10000。
接下来m行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在0-1,000,000,000之间。
输出
m行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。若有多个值满足条件,输出最小的一个。

#include 
#include 
#include 

int main()
{
    int n,m,i,j,mid,x,k;
    int a[100005];

    scanf("%d",&n);
    for (i=0;iscanf("%d",&a[i]);
    }
    scanf("%d",&m);
    for (k=0;kscanf("%d",&x);
        for (i=0,j=n-1;i2;
            if (a[mid]>x)
                j=mid;
            else if (a[mid]1;
            else
                i=j=mid;
        }
        if (x-a[j]<=a[i]-x)
            printf("%d\n",a[j]);
        else
            printf("%d\n",a[i]);

    }

    return 0;
}


测试样例能过,但得了4分

img

解答如下

#include <stdio.h>
#include <math.h>
 
int main()
{
    int n,m,i,j,mid,x,k;
    int a[100005];
 
    scanf("%d",&n);
    for (i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    scanf("%d",&m);
    for (k=0;k<m;k++)
    {
        scanf("%d",&x);
        int min=abs(a[0]-x);
        int p=0;
        for (j=0;j<n;j++)
        {
            int tem=abs(a[j]-x);
             if(tem<min)
             {
                 min=tem;
                 p=j;
             }
        }
        printf("%d\n",a[p]);
    }
    return 0;
}