Description
给你一个序列,然后给你m个元素,让你从序列中找出与每个元素最接近的数字输出来,如果有两个就输出两个。
Input
多组输入,第一行给你两个数n(0 < n < 10000000),m(0 < m < n),接下来是数列的n个数,然后再输入m个元素,让你找出最接近每个元素的值。如果有两个,按从小到大输出。
Output
这m个数分别输出最接近每个元素的值,组与组之间输出一个空行。
Sample
Input
8 4
1 2 3 4 5 6 8 11
4
9
2
7
Output
4
8
2
6 8
这个题有一个小坑,他没有说输入的n个数是有序的,所以要进行排序…
然后就是二分查找,再根据二分查找的结果进行输出。。。
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
int a[10000010];
void shuchu(int data1, int data2, int x) {
if (data2 - x < x - data1) {
printf("%d\n", data2);
} else if (x - data1 < data2 - x) {
printf("%d\n", data1);
} else {
printf("%d %d\n", data1, data2);
}
}
int main() {
int n, m;
while (scanf("%d %d", &n, &m) != EOF) {
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
sort(a+1,a+n+1);
while (m--) {
int x;
scanf("%d", &x);
int l = 1, r = n, mid;
while (l <= r) {
mid = (l + r) / 2;
if (a[mid] == x)
break;
else if (a[mid] > x)
r = mid - 1;
else
l = mid + 1;
}
if (a[mid] == x)
printf("%d\n", a[mid]);
else if (mid == n) {
if (a[mid - 1] < x && n > 1)
shuchu(a[mid - 1], a[mid], x);
else
printf("%d\n", a[mid]);
} else if (mid == 1) {
if (a[mid + 1] > x && n > 1)
shuchu(a[mid], a[mid + 1], x);
else
printf("%d\n", a[mid]);
} else {
if (a[mid] > x) shuchu(a[mid - 1], a[mid], x);
if (a[mid] < x) shuchu(a[mid], a[mid + 1], x);
}
}
printf("\n");
}
return 0;
}