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

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况