求解递增序列中与x最接近的元素问题,分治法,c++

img

img

为啥要这么麻烦呢?已经是有序得了,找到指定数据的插入位置就行了。左右两侧必然是离他最近的数,比较差值绝对值小的那个就是了

#include <bits/stdc++.h>
using namespace std;

int abs(int num){
if(num < 0)
return -num;
}

void f(int a[], int n, int m, int b[]){
for(int i = 0; i < m; i++){
if(a[0] > b[i]){
b[i] = a[0];
continue;
}
if(a[n -1] < b[i]){
b[i] = a[n -1];
continue;
}
int l = 0, r = n -1;
int mid;
while(l < r){
mid = (l + r) / 2;
if(a[mid] >= b[i])
r = mid;
else
l = mid + 1;
}
if(a[l] == b[i] || (abs(a[l] - b[i]) <= abs(a[l -1] -b[i])))
b[i] = a[l];
else
b[i] = a[l -1];
}
}

int main(){
int n, x, m;
int a[n];
cin >> n;
for(int i = 0; i < n; i++)
cin >> a[i];
cin >> m;
int b[m];
for(int i = 0; i < m; i++)
cin >> b[i];
f(a, n, m, b);
for(int i = 0; i < m; i++)
cout << " " << b[i];
return 0;

}
这个代码错的,但我不会改正