• Openjudge NOI题库 ch0111/01 查找最近的元素


    总时间限制:
    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 #include <stdio.h>
     2 #include <stdlib.h>
     3 #define maxn 100010
     4 int a[maxn];
     5 int n;
     6 int cmp(const void *a,const void *b)
     7 {
     8     return *(int *)a-*(int *)b;
     9 }
    10 void search(int x)
    11 {
    12     int mid,l,r,ans=-1;
    13     mid=n/2;
    14     l=0;
    15     r=n;
    16     while(l<r-1)
    17     {
    18         if(a[mid]>x) r=mid;
    19         else l=mid;
    20         mid=(r+l)/2;
    21     }
    22     if(l+1==n||x-a[l]<=a[l+1]-x) ans=a[l];
    23     else ans=a[l+1];
    24     printf("%d
    ",ans);
    25 }
    26 int main()
    27 {
    28     int m,f;
    29     int i;
    30     scanf("%d",&n);
    31     for(i=0;i<n;i++)
    32         scanf("%d",&a[i]);
    33     qsort(a,n,sizeof(int),cmp);
    34     scanf("%d",&m);
    35     while(m--)
    36     {
    37         scanf("%d",&f);
    38         search(f);
    39     }
    40     return 0;
    41 }

    作为一道最基础的二分题,好像也没什么好讲的,也就是while(m--)的小技巧罢了。

  • 相关阅读:
    发送xml请求数据,返回数据怎么获取
    laravel打印sql语句
    布隆过滤器-使用场景的思考
    sql性能优化
    JS Date.parse() 函数详解
    vuejs中的watch监听属性
    JS正则test()方法
    golang实现简单线程池
    golang map实现set
    golang init函数
  • 原文地址:https://www.cnblogs.com/KakagouLT/p/5022397.html
Copyright © 2020-2023  润新知