题意:
给出你一个
n
∗
m
n*m
n∗m的地方,其中a个人的家,b个饭店,让你求出a个人都从家出发到达一个饭店,需要的最长时间最小是多少且第几个饭店。
思路:
是一个分割找边界问题,如果以每个饭店(l,r)为原点的话那么就可以把整个
n
∗
m
n*m
n∗m的地方分成四个象限。而应我们要求的最大值,也就是边角(x,y)表示家会成为我们要求的结果,
- 对于第一象限最长时间是 x − l + y − r x-l+y-r x−l+y−r
- 对于第二象限最长时间是 l − x + y − r l-x+y-r l−x+y−r
- 对于第三象限最长时间是 l − x + r − y l-x+r-y l−x+r−y
- 对于第四象限最长时间是
x
−
l
+
r
−
y
x-l+r-y
x−l+r−y
说简单点就是横坐标差绝对值加上纵坐标差绝对值。之所以把他分开是因为这样会优化时间,只算边角就行。在化一下,结合一下,把家的放一起,把饭店的放一起
(1). 对于第一象限最长时间是
(
x
+
y
)
+
(
−
l
−
r
)
(x+y)+(-l-r)
(x+y)+(−l−r)
(2). 对于第二象限最长时间是
(
−
x
+
y
)
+
(
l
−
r
)
(-x+y)+(l-r)
(−x+y)+(l−r)
(3). 对于第三象限最长时间是
(
−
x
−
y
)
+
(
r
+
l
)
(-x-y)+(r+l)
(−x−y)+(r+l)
(4). 对于第四象限最长时间是
(
x
−
y
)
+
(
−
l
+
r
)
(x-y)+(-l+r)
(x−y)+(−l+r)
其实可以看出同一类型的(横纵符号是相反的这样才是距离)
通过上面的结合,我们就得到最远点一定在 这四个边角点,就先找出
(
−
l
−
r
)
,
(
l
−
r
)
,
(
−
l
+
r
)
,
(
l
+
r
)
(-l-r),(l-r),(-l+r),(l+r)
(−l−r),(l−r),(−l+r),(l+r)这四组的最大值找出来,然后再加上每个饭店对应的(x,y)求出这四个状态的最大值就是我们要找的那个点,然后再最小化就可以了。
#include<bits/stdc++.h>
using namespace std;
long long sum,ans;
int x[50],y[50];
int main() {
int n,m,l,r,u,v;
cin>>u>>v;
cin>>n;
for(int i=1; i<=4; i++) {
x[i]=-1e9+7;
}
for(int i=1; i<=n; i++) {
scanf("%d%d",&l,&r);
x[1]=max(x[1],-l-r);///第一象限
x[2]=max(x[2],l-r);///第二象限
x[3]=max(x[3],l+r);///第三象限
x[4]=max(x[4],-l+r);///第四象限
}
cin>>m;
int ans=2e9+7,res;
for(int i=1; i<=m; i++) {
scanf("%d%d",&l,&r);
int sum=0;
sum=max(sum,x[1]+l+r);///第一象限
sum=max(sum,x[2]-l+r);///第二象限
sum=max(sum,x[3]-l-r);///第三象限
sum=max(sum,x[4]+l-r);///第四象限
if(sum<ans) {
ans=sum;
res=i;
}
}
cout<<ans<<endl<<res<<endl;
return 0;
}