题目背景
编程俱乐部为了准备开学的社团活动,需要采购活动物品,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;
}