您的位置:首页 > 其它

二分法之查找最接近目标数的数

2017-09-23 21:46 323 查看

/*
Name: 01_查找最接近的元素
Copyright: 
Author: 
Date: 23-01-18 11:05
Description: 

查看 提交 统计 提问

总时间限制: 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

*/

#include<iostream>    

#include<cstdio>    

#include<cstdlib>    

    

using namespace std;    

    

const int MAXN = 100000;   

int A[MAXN];  

int Fun(int A[], int left, int right, int key);  

int Fun2(int A[], int left, int right, int key); 

    

int main()     

{    

    int n, m, key;  

    cin >> n;    

    for (int i=0; i<n; i++)    

        cin >> A[i];    

    cin >> m; 

    for (int i=0; i<m; i++)   
{
cin >> key; 
cout << Fun(A, 0, n-1, key) << endl;
cout << Fun2(A, 0, n-1, key) << endl;


          

    return 0;    

}    

int Fun(int A[], int left, int right, int key)

{
if (key <= A[left])  

        return A[left];

    else if (key >= A[right])  

        return A[right];

    else  

    {  

        int mid;   

        while (left <= right)  //循环结束left>right  

        {    

            mid = (left + right) / 2;    

            if (key > A[mid])      

                left = mid + 1;    

            else    

                right = mid - 1;    

        }    

        if (A[left]-key < key-A[right])//当最接近的数有2个时,输出值较小的一个  

            return A[left];

        else  

            return A[right];

    }   

}

int Fun2(int A[], int left, int right, int key)



    int mid;   

    while (left < right - 1)//循环结束left<=right

    {    

        mid = (left + right) / 2;    

        if (key > A[mid])      

            left = mid;    

        else    

            right = mid;    

    }    

    if (key-A[left] <= A[right]-key)//当最接近的数有2个时,输出值较小的一个  

        return A[left];

    else  

        return A[right];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: