D - 二分练习

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

#include <stdio.h>
#include <string.h>
#include<algorithm>
using namespace std;
int a[10000010];
int main()
{
    int n,m,k;
    while(~scanf("%d %d",&n,&m))
    {
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        sort(a,a+n);
        int flag;
        while(m--)
        {
            scanf("%d",&k);
            if(k>a[n-1])
                printf("%d\n",a[n-1]);
            else if(k<a[0])
                printf("%d\n",a[0]);
            else
            {
                int mid;
                int l=0,r = n-1;
                flag = 0;
                while(l<=r)
                {
                    mid = (l+r)/2;
                    if(k<a[mid])
                        r = mid-1;
                    else if(k>a[mid])
                        l = mid+1;
                    else
                    {
                        flag = 1;
                        break;
                    }

                }
                if(flag)
                    printf("%d\n",k);
                else
                {
                    if(k-a[r] == a[l]-k)
                        printf("%d %d\n",a[r],a[l]);
                    else if(k-a[r] < a[l]-k)
                        printf("%d\n",a[r]);
                    else
                        printf("%d\n",a[l]);
                }
            }
        }
        printf("\n");
    }
    return 0;
}


发布了176 篇原创文章 · 获赞 7 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Fusheng_Yizhao/article/details/104929247