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

 /* 
  
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    
#include    
#include    
    
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         cin >> A[i];    
    cin >> m; 
    for (int i=0; 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];
}

你可能感兴趣的:(二分法,编程训练营,JudgeOnline)