题目概述
有
n
个人,位置在
解题报告
要求最大值最小,所以用二分枚举答案
mid
。然后问题是怎么判断是否可行,由于是直线距离,根据贪心,我们将
a
和
有一个结论:如果
i
选
示例程序
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e3,maxm=2e3;
int n,m,p,a[maxn+5],b[maxm+5];
inline int abs(int x) {if (x<0) return -x;return x;}
bool check(int MAX)
{
for (int i=1,j=1;i<=n;i++)
{
while (j<=m&&abs(a[i]-b[j])+abs(p-b[j])>MAX) j++;
if (j>m) return false;j++;
}
return true;
}
int main()
{
freopen("program.in","r",stdin);
freopen("program.out","w",stdout);
scanf("%d%d%d",&n,&m,&p);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
for (int i=1;i<=m;i++) scanf("%d",&b[i]);
sort(a+1,a+1+n);sort(b+1,b+1+m);
int L=0,R=2e9;
while (L<=R)
{
int mid=L+(R-L>>1);
if (check(mid)) R=mid-1; else L=mid+1;
}
return printf("%d\n",L),0;
}