二分法之查找最接近目标数的数
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];
}
相关文章推荐
- java折半查找法 查找数组中与目标数最接近的数
- 查找和目标数最接近的或者相等的数
- 二叉搜索树中查找与目标数字最接近的节点
- 从一个数组中查找和目标数最接近的或者相等的数
- 二分法查找已排序数列中目标数字的位置
- 二分法查找,用少量的步数找到目标
- 二叉搜索树查找与目标数字最接近的节点。
- C#版本,二分法查找元素是否在一个目标数组中?
- 二分法查找
- 在所有的文件的右键菜单中加入快捷命令“查找目标...”
- 查找一个有序数组中的一个元素——二分法
- 冒泡排序、选择和插入排序、二分法查找
- 二分法查找
- 黑马程序员--选择排序、冒泡排序、二分法查找
- 二分法查找
- 二分法简单排序和查找
- perl实现二分法的ip查找
- 查找最接近的元素
- 二分法查找
- 查找-二分法查找