题意:n个城市,m个蜂窝网络。他们的坐标在一条直线上。且给定的坐标都是从左到右依次给出。问网络的覆盖范围r至少为多大时,能将所有城市包含进去
思路:如果r可以,那么r+1,r+2...都可以。在给定的范围二分,判断每个r是否满足条件。
#include<cstdio>
#include<set>
#include<map>
#include<stack>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn =1e5;
int a[maxn],b[maxn];
int n,m;
bool check(int r)
{
int cur=0;
for(int i=0;i<m;i++)
{
ll left=b[i]-r;
ll right=b[i]+r;
while(cur<n&&a[cur]>=left&&a[cur]<=right)cur++;
}
if(cur==n)return true;
return false;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<n;i++)scanf("%d",&a[i]);
for(int i=0;i<m;i++)scanf("%d",&b[i]);
ll l=0,r=(int)2*1e9;
while(l<r)
{
ll mid=(l+r)/2;
if(check(mid))//找最小值
{
r=mid;
}
else
{
l=mid+1;
}
}
printf("%d\n",l);
}
}