二分练习

来源:互联网 发布:电商网站php 编辑:程序博客网 时间:2024/06/01 09:10

二分练习

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

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

输入

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

输出

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

示例输入

8 41 2 3 4 5 6 8 114927

示例输出

4826 8

提示

 

来源

lwn

示例程序

 
#include <stdio.h>    #include <string.h>    int a[10000000];    void Qsort(int r[],int s,int t)    {        int low=s,high=t,mid;        int key=r[low];        if (low<high)        {            while (low<high)            {                while (low<high&&r[high]>=key)                    high--;                r[low]=r[high];                while (low<high&&r[low]<=key)                    low++;                r[high]=r[low];            }            r[low]=key;            mid=low;            Qsort(r,s,mid-1);            Qsort(r,mid+1,t);        }    }    int main()    {        int n,m,x,i;        while (scanf("%d%d",&n,&m)!=EOF)        {            for (i=0;i<n;i++)                scanf("%d",&a[i]);            Qsort(a,0,n-1);            while (m--)            {                scanf("%d",&x);                if (x<a[0])                    printf("%d\n",a[0]);                else if (x>a[n-1])                    printf("%d\n",a[n-1]);                else                {                    int low=0,high=n-1,mid;                    while (low<=high)                    {                        mid=(low+high)/2;                        if (x<a[mid])                            high=mid-1;                        else if (x>a[mid])                            low=mid+1;                        else if (x==a[mid])                        {                            printf("%d\n",x);                            break;                        }                    }                    if (low>high)                    {                        if (x-a[high]<a[low]-x)                            printf("%d\n",a[high]);                        else if (a[low]-x<x-a[high])                            printf("%d\n",a[low]);                        else                            printf("%d %d\n",a[high],a[low]);                    }                }            }            printf("\n");        }        return 0;    }   

0 0