mushanyu_ 2022-09-26 20:12 采纳率: 64.3%
浏览 277

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

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

#include <stdio.h>
#include <stdlib.h>
#include <string.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);
        for (i=0,j=n-1;i<j;)
        {

            mid=(i+j)/2;
            if (a[mid]>x)
                j=mid;
            else if (a[mid]<x)
                i=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

  • 写回答

1条回答 默认 最新

  • fuill 2022-09-27 10:27
    关注

    解答如下

    #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;
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 9月26日

悬赏问题

  • ¥15 爬虫爬取网站的一些信息
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题
  • ¥15 Utunbu中vscode下cern root工作台中写的程序root的头文件无法包含
  • ¥15 麒麟V10桌面版SP1如何配置bonding
  • ¥15 Marscode IDE 如何预览新建的 HTML 文件
  • ¥15 K8S部署二进制集群过程中calico一直报错