二分练习
Description
给你一个序列,然后给你m个元素,让你从序列中找出与每个元素最接近的数字输出来,如果有两个就输出两个。
Input
多组输入,第一行给你两个数n(0 < n < 10000000),m(0 < m < n),接下来是数列的n个数,然后再输入m个元素,让你找出最接近每个元素的值。如果有两个,按从小到大输出。
Output
这m个数分别输出最接近每个元素的值,组与组之间输出一个空行。
Samples
Sample #1
Input
8 4
1 2 3 4 5 6 8 11
4
9
2
7
Output
4
8
2
6 8
超时做法
#include <iostream>
#include <cmath>
using namespace std;
const int N = 1e7 + 10;
int a[N];
int bsearch(int l, int r, int k)
{
while (l <= r)
{
int mid = l + r >> 1;
if (a[mid] == k)
return mid;
else if (a[mid] > k)
r = mid - 1;
else
l = mid + 1;
}
return -1;
}
int main()
{
int n, m, k;
while (~scanf("%d %d", &n, &m))
{
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
while (m--)
{
scanf("%d", &k);
int b = bsearch(0, n - 1, k);
if (b == -1)
{
int min = 100000000, c1, c2 = 0;
for (int i = 0; i < n; i++)
{
if (abs(a[i] - k) < min)
{
c1 = a[i];
min = abs(a[i] - k);
continue;
}
if (abs(a[i] - k) == min)
{
c2 = a[i];
break;
}
}
if (c2)
cout << c1 << ' ' << c2 << '\n';
else
cout << c1 << '\n';
}
else
cout << a[b] << '\n';
}
}
return 0;
}