SDUT-2781 二分练习

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

Sample Output

4
8
2
6 8

题解

二分查找需要判断待求数是否小于最小的数,是否大于最大的数
否则左边界或者右边界会变为-1

CODE

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <stack>
#include <deque>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <queue>
#include <functional>
using namespace std;
int a[10000010];
int main()
{
    int n,i,m,mid,c;
    while(scanf("%d %d",&n,&c)!=EOF)
    {
        for(i=0; i<n; i++)
            scanf("%d",&a[i]);
        sort(a,a+i);
        while(c--)
        {
            scanf("%d",&m);
            if(m < a[0])
            {
                printf("%d\n",a[0]);
                continue;
            }
            if(m > a[i-1])
            {
                printf("%d\n",a[n-1]);
                continue;
            }
            int l=0,r=i-1;
            while(l<=r)
            {
                mid = (l+r)/2;
                if(a[mid]==m)
                    break;
                else if(a[mid] < m)
                    l = mid +1;
                else
                    r= mid -1;
            }
            if(a[mid]==m)
                printf("%d\n",m);
            else if(a[l]-m==m-a[r])
                printf("%d %d\n",a[r],a[l]);
            else if(a[l]-m<m-a[r])
                printf("%d\n",a[l]);
            else
                printf("%d\n",a[r]);

        }
        printf("\n");

    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/AC__GO/article/details/81178299
今日推荐