二分练习

来源:互联网 发布:端口名称怎么查 编辑:程序博客网 时间:2024/06/05 16:24

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;}
原创粉丝点击