您的位置:首页 > 其它

codeforces 702C Cellular Network 二分

2017-07-13 09:30 288 查看
题意: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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: