Think:
很简单的二分查找题, 可用STL解题, 或 普通二分模板
一点要处理好极端条件:
例如key >= a[n - 1] 或 key <= a[ 0 ];的情况
Problem Description
给你一个序列,然后给你m个元素,让你从序列中找出与每个元素最接近的数字输出来,如果有两个就输出两个。
Input
多组输入,第一行给你两个数n(0 < n < 10000000),m(0 < m < n),接下来是数列的n个数,然后再输入m个元素,让你找出最接近每个元素的值。如果有两个,按从小到大输出。
Output
这m个数分别输出最接近每个元素的值,组与组之间输出一个空行。
Example Input
8 4
1 2 3 4 5 6 8 11
4
9
2
7
Example Output
4
8
2
6 8
STL的AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<functional>
using namespace std;
int a[10000050];
int main()
{
int n, m;
int i;
while(~scanf("%d %d", &n, &m))
{
for (i = 0; i <= n - 1; i ++)
{
scanf("%d", &a[i]);
}
sort(a, a + n);
for (i = 0; i <= m - 1; i ++)
{
int key;
scanf("%d", &key);
if (key >= a[n - 1])
{
printf("%d\n", a[n - 1]);
continue;
}
if (key <= a[0])
{
printf("%d\n", a[0]);
continue;
}
if (binary_search(a, a + n , key) == true)
printf("%d\n", key);
else
{
int k1 = lower_bound(a, a + n, key) - a;
int k2 = upper_bound(a, a + n, key) - a;
k1 = a[k1 - 1];
k2 = a[k2];
if (key -k1 == k2 - key)
printf("%d %d\n", k1, k2);
if (key - k1 > k2 - key)
printf("%d\n", k2);
if (key - k1 < k2 - key)
printf("%d\n", k1);
}
}
printf("\n");
}
}
二分模板AC代码
#include<cstdio>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int a[10000050];
int Binary_search(int low, int high, int key);
int main()
{
int n, m;
int i;
int PW;
while(~scanf("%d %d", &n, &m))
{
for(i = 0; i <= n - 1; i ++)
scanf("%d", &a[i]);
sort(a, a + n);
for (i = 0; i <= m - 1; i ++)
{
int key;
scanf("%d", &key);
if (key >= a[n - 1])
{
printf("%d\n", a[n - 1]);
continue;
}
if (key <= a[0])
{
printf("%d\n", a[0]);
continue;
}
PW = Binary_search(0, n - 1, key);
if(a[PW] == key)
printf("%d\n", key);
else
{
if (key - a[PW] == a[PW + 1] - key)
printf("%d %d\n", a[PW], a[PW + 1]);
if (key - a[PW] < a[PW + 1] - key)
printf("%d\n", a[PW]);
if (key - a[PW] > a[PW + 1] - key)
printf("%d\n", a[PW + 1]);
}
}
printf("\n");
}
}
int Binary_search(int low, int high, int key)
{
int mid;
while(low <= high)
{
mid = (low + high) / 2;
if (a[mid] == key)
break;
else if (key < a[mid])
high = mid - 1;
else if (key > a[mid])
low = mid + 1;
}
if (a[mid] <= key)
return mid;
else
return mid - 1;
}