采购礼品&&二分查找

题目背景

编程俱乐部为了准备开学的社团活动,需要采购活动物品,mxj联系某条街上的n个人,该条街长度为L,一共有m家店。

题目描述

现在这n个人想知道距离自己最近的店距离是多少,请你求出来。

输入格式:

第一行,两个空格隔开的正整数,L, m, 题意如上。
接下来m行,每行一个正整数,表示店铺位置。
第m+1行,一个正整数n,代表人数。
接下来n行,每行一个正整数,代表第i个人所处的位置Pi。

输出格式:

输出n行,代表每个人距离自己最近店的路程。

输入样例#1:

3 1
1
3
1
2
3

输出样例#1:

0
1
2

说明

1≤L≤109
1≤m≤105
1≤n≤105
且m≤n。

代码+题解

#include<stdio.h>
#include<algorithm>
using namespace std;
int L,m,n,a,b,P;
int arr[100005];
int main()
{

    scanf("%d%d",&L,&m);
    for(int i=1; i<=m; i++)
    {
        scanf("%d",&arr[i]);
    }
    sort(arr+1,arr+m+1);
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
    {
        int mid=1;
        scanf("%d",&P);
        int x=1,y=m;
        b=m;
        while(x<=y)          //直接二分
        {
            mid=(x+y)/2;
            if(arr[mid]>=P)
            {
                b=mid;
                y=mid-1;
            }
            else x=mid+1;
        }
        if(m==1)             //分情况输出。
        {
            printf("%d\n",abs(P-arr[1]));
        }
        else
        {
            if(b==1)printf("%d\n",abs(P-arr[b]));
            else
            printf("%d\n",min(abs(P-arr[b]),abs(P-arr[b-1])));
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43105110/article/details/88087637