二分练习(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

模板题

扫描二维码关注公众号,回复: 2322928 查看本文章

代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
using namespace std;
int a[10000010];
int search1(int k,int m)
{
    int mid,left=0,right=m-1,p=0;
    while(left<=right)
    {
        mid = (left+right)/2;
        if(a[mid]<=k)
        {
            left=mid+1;
            p=a[mid];
        }
        else
        {
            right=mid-1;
        }
    }
    return p;
}
int search2(int k,int m)
{
    int mid,left=0,right=m-1,p=0;
    while(left<=right)
    {
        mid = (left+right)/2;
        if(a[mid]<k)
        {
            left=mid+1;
        }
        else
        {
            right=mid-1;
            p=a[mid];
        }
    }
    return p;
}
int search3(int k,int m)
{
    int mid,left=0,right=m-1,p=0;
    while(left<=right)
    {
        mid = (left+right)/2;
        if(a[mid]<k)
        {
            left=mid+1;
        }
        else if(a[mid]>k)
        {
            right=mid-1;
        }
        else
        {
            p=a[mid];
            break;
        }
    }
    return p;
}
int main()
{
    int n,i,k,m;
    while(~scanf("%d%d",&m,&n))
    {
    	memset(a,0,sizeof(a[0]));
        for(i=0; i<m; i++)
        {
            scanf("%d",&a[i]);
        }
        sort(a,a+m);
        for(i=0; i<n; i++)
        {
            scanf("%d",&k);
            if(k<=a[0])
                printf("%d\n",a[0]);
            else if(search3(k,m)==k)
                printf("%d\n",k);
            else if(abs(k-search1(k,m))>abs(k-search2(k,m)))
                printf("%d\n",search2(k,m));
            else if(abs(k-search1(k,m))<abs(k-search2(k,m)))
                printf("%d\n",search1(k,m));
            else if(abs(k-search1(k,m))==abs(k-search2(k,m)))
                printf("%d %d\n",search1(k,m),search2(k,m));
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/baiyi_destroyer/article/details/81139751
今日推荐