zoukankan      html  css  js  c++  java
  • CCF NOI1044 最近元素

    问题链接CCF NOI1044 最近元素




    时间限制: 1000 ms  空间限制: 262144 KB

    题目描述 

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

    输入

      第一行包含一个整数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 <= n <= 100000。

    提示

     




    问题分析

      这是一个查找问题,可以使用二分法

      输入数据是非降序的,所以就不用排序了。

      找的数满足差值最小,而差值有可能为正,也有可能为负。对于中间的数, 差值为正时,差值更小的数必然在左边;差值为负时,差值更小的数必然在右边。

    程序说明

      (略)

    要点详解

    • 二分法属于分治法,是有效的方法,其计算复杂度为log(n)。



    参考链接:(略)。

    100分通过的C语言程序:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define N 100000
    int a[N];
    
    int find(int start, int end, int x)
    {
        int mid;
    
        while(start < end) {
            mid = (start + end) / 2;
    
            if(a[mid] > x)
                end = mid;
            else
                start = mid;
    
            if(start + 1 == end) {
                if(abs(x - a[start]) > abs(x - a[end]))
                    start = end;
                else
                    end = start;
    
            }
        }
    
        return start;
    }
    
    int main(void)
    {
        int n, m, x, i;
    
        // 读入数据
        scanf("%d", &n);
        for(i=0; i<n; i++)
            scanf("%d", &a[i]);
    
        // 处理询问
        scanf("%d", &m);
        for(i=1; i<=m; i++) {
            scanf("%d", &x);
    
            // 二分查找
            int anspos = find(0, n - 1, x);
    
            // 输出结果
            printf("%d
    ", a[anspos]);
        }
    
        return 0;
    }




  • 相关阅读:
    洛谷 P1521 求逆序对
    火柴棒等式(2008年NOIP全国联赛提高组)
    扫雷游戏
    数字统计(2010年NOIP全国联赛普及组)
    祖瑪
    巧克力棒&&新年的巧克力棒
    关押罪犯(2010年NOIP全国联赛提高组)
    大整数运算||高精度运算
    國王遊戲(2012年NOIP全国联赛提高组)
    谁拿了最多奖学金(2005提高组第一题)
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563827.html
Copyright © 2011-2022 走看看