查找最接近的元素 2020/11/26
#include<iostream>
using namespace std;
//查找最接近的元素
int a[100000];
int b[10000];
int n;
int search(int t) {
int left = 0, right = n-1;
while (left < right)
{
if (a[left] == t || a[right] == t)//当查找到相同的数字时直接返回
{
return t;
}
if (right - left == 1)//当左标和右标相邻时,取值更靠近t的那个
{
return (abs(a[right] - t )>= abs(a[left] - t)) ? a[left] :a[right];
}
if (a[(left + right) / 2] > t)
{
right = (left + right) / 2;
}
else
{
left= (left + right) / 2;
}
}
return 0;
}
int main()
{
int m;
int i = 0;
//采用二分法
cin >> n;
while (i<n)
{
cin >> a[i];
i++;
}
cin >> m;
i = 0;
while (i < m)
{
cin >> b[i];
i++;
}
for (i = 0; i < m; i++)
{
cout<<search(b[i])<<endl;
}
return 0;
}
就是一个简单的二分法,标程如下:
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 10;
int n, m, b;
int a[maxn];
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; ++i)
{
scanf("%d", &a[i]);
}
scanf("%d", &m);
for (int i = 0; i < m; ++i)
{
scanf("%d", &b);
if (b > a[n - 1]) {
printf("%d\n", a[n - 1]);
continue;
}
if (b <= a[0]) {
printf("%d\n", a[0]);
continue;
}
int x = lower_bound(a, a + n, b) - a;
if (a[x] - b < b - a[x - 1]) {
printf("%d\n", a[x]);
}
else {
printf("%d\n", a[x - 1]);
}
}
return 0;
}
标程直接利用了lower_bound函数。
lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
不讲武德