SDUTOJ 2781 二分练习——二分搜索

来源:互联网 发布:广州数控g71编程实例 编辑:程序博客网 时间:2024/09/21 06:35

题目描述

给你一个序列,然后给你m个元素,让你从序列中找出与每个元素最接近的数字输出来,如果有两个就输出两个。
 

输入

 多组输入,第一行给你两个数n(0 < n < 10000000),m(0 < m < n),接下来是数列的n个数,然后再输入m个元素,让你找出最接近每个元素的值。如果有两个,按从小到大输出。
 

输出

 这m个数分别输出最接近每个元素的值,组与组之间输出一个空行。

示例输入

8 41 2 3 4 5 6 8 114927

示例输出

4826 8
<span style="font-size:24px;">#include <stdio.h>#include <stdlib.h>#include <string.h>#include <algorithm>using namespace std;int s[10000010];int main(){    int n=0,k=0,l=0,mid,i=0,flag=0,head=0,tail=0;    while(scanf("%d%d",&n,&k)!=EOF)    {        for(i=0; i<n; i++)        {            scanf("%d",&s[i]);        }        sort(s,s+n);        for(i=0; i<k; i++)        {            flag=0;            scanf("%d",&l);            head=0;            tail=n-1;            while(head<=tail)   //二分搜索            {                mid=head+(tail-head)/2;                if(s[mid]==l)                {                    printf("%d\n",l);                    flag=1;                    break;                }                if(l<s[mid])                {                    tail=mid-1;                }                if(l>s[mid])                {                    head=mid+1;                }            }            if(flag==0&&l<s[n-1]&&l>s[0])//下面是我一开始被掉进去的坑            {                if((l-s[tail])==(s[head]-l))                {                    printf("%d %d\n",s[tail],s[head]);                    continue;                }                else                {                    if((l-s[tail])<(s[head]-l))                    {                        printf("%d\n",s[tail]);                    }                    else                    {                        printf("%d\n",s[head]);                    }                }            }            if(flag==0&&l>s[n-1])            {                printf("%d\n",s[n-1]);            }            if(flag==0&&l<s[0])            {                printf("%d\n",s[0]);            }        }        printf("\n");    }    return 0;}</span>


0 0
原创粉丝点击