NeQrhk 2015-12-25 12:53 采纳率: 30.6%
浏览 2362

问一道acm二分查找的题目。

查找最接近的元素
查看 提交 统计 提问
总时间限制: 1000ms 内存限制: 65536kB
描述
在一个非降序列中,查找与给定值最接近的元素。

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

  • 写回答

1条回答 默认 最新

  • threenewbee 2015-12-25 13:44
    关注
     #include<cstdio>
    #include<cmath>
    #include<iostream>
    using namespace std;
    #define N 100005
    int n,m,x,l,r,mid;
    long long a[N];
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        scanf("%d",&m);
        while(m--){
            scanf("%d",&x);
            l=0,r=n+1;
            if(x<=a[1]) {printf("%d\n",a[1]);continue;}
            if(x>=a[n]) {printf("%d\n",a[n]);continue;}
            while(l<r){
                mid=(l+r)>>1;
                if(a[mid]<x)
                    l=mid;
                else if(a[mid]>x)
                    r=mid;
                else {l=mid;break;}
                if(l==r-1&&a[l]<x&&a[r]>x) break;
            }
            if(abs(a[l]-x)<=abs(a[r]-x))
                printf("%d\n",a[l]);
            else printf("%d\n",a[r]);
        }
        return 0;
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 Matlab怎么求解含参的二重积分?
  • ¥15 苹果手机突然连不上wifi了?
  • ¥15 cgictest.cgi文件无法访问
  • ¥20 删除和修改功能无法调用
  • ¥15 kafka topic 所有分副本数修改
  • ¥15 小程序中fit格式等运动数据文件怎样实现可视化?(包含心率信息))
  • ¥15 如何利用mmdetection3d中的get_flops.py文件计算fcos3d方法的flops?
  • ¥40 串口调试助手打开串口后,keil5的代码就停止了
  • ¥15 电脑最近经常蓝屏,求大家看看哪的问题
  • ¥60 高价有偿求java辅导。工程量较大,价格你定,联系确定辅导后将采纳你的答案。希望能给出完整详细代码,并能解释回答我关于代码的疑问疑问,代码要求如下,联系我会发文档