版权声明:代码属于原创,转载请联系作者并注明出处。 https://blog.csdn.net/weixin_43379056/article/details/84952438
1044. 最近元素
题目描述
在一个非降序列中,查找与给定值最接近的元素。
输入
第一行包含一个整数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。
C++代码
#include <iostream>
#include <cassert>
#include <algorithm>
using namespace std;
const int N = 100000; // maximum n
const int M = 10000; // maximum m
const int MAX_NUM = 1000000000; // maximum number
int cmp(const void *v1, const void *v2)
{
return int(*((long long *)v1) - *((long long *)v2)); // sort ascending
}
long long search(long long myArray[],int size,long long num)
{
int start,end,mid;
start = 0;
end = size - 1;
mid = (start+end)/2;
if(myArray[start] > num)
{
return myArray[start];
}
else if (myArray[end] < num)
{
return myArray[end];
}
while(start <= end)
{
if(myArray[mid] > num)
{
end = mid-1;
mid = (start+end)/2;
continue;
}
if(myArray[mid] < num)
{
start = mid+1;
mid = (start+end)/2;
continue;
}
break;
}
if ((myArray[mid+1]-num) >= (num-myArray[mid]))
{
return myArray[mid];
}
else
{
return myArray[mid+1];
}
}
int main()
{
int n;
cin >> n;
assert(1 <= n && n <= N);
long long nIntArray[N];
for(int i=1; i<=n; i++)
{
cin >> nIntArray[i-1];
assert(0 <= nIntArray[i-1] && nIntArray[i-1] <= MAX_NUM);
}
// sort ascending
qsort(nIntArray, n, sizeof(long long), cmp);
int m;
cin >> m;
assert(1 <= m && m <= M);
long long mIntArray[M];
for(int i=1; i<=m; i++)
{
cin >> mIntArray[i-1];
}
for(int i=1; i<=m; i++)
{
cout << search(nIntArray, n, mIntArray[i-1]) << endl;
}
return 0;