如果使用常规思路记录所有婚介所的距离,之后每输入一个坐标再去遍历一遍婚介所并计算出距离的话,根据题目所给的数据规模来看,这题肯定是会TLE的,所以我们得换一个思路,能不能对婚介所坐标数据进行处理后再计算小张与婚介所之间的距离呢?答案是肯定的,下面我们便来推导一下这个过程(今天才学会用word写公式的方法233)
上式(曼哈顿距离公式)可分为四种情况讨论
显然通过曼哈顿距离公式计算出的距离即为上述四个公式中计算出来的最大的那个值(可以自己去验证一下),所以我们只需要求出推导四种情况下距离公式右边括号中四种情况的最大值即可得出答案.
由于这篇博客有班上的同学要看,所以就用C语言写啦
#include <stdio.h>
#include <string.h>
int r[4]; //保存四个右边的项
int max( int a, int b ) { //c语言中没有max函数,得自己写一个
return a > b ? a : b;
}
void init() { //初始化
int i;
for ( i = 0; i < 4; i++ ) r[i] = -0x3f3f3f3f;
}
void input() { //输入
int tx, ty, i, n;
scanf("%d", &n);
while(n--) {
scanf("%d %d", &tx, &ty);
r[0] = max( r[0], -tx+ty );
r[1] = max( r[1], -tx-ty );
r[2] = max( r[2], tx+ty );
r[3] = max( r[3], tx-ty );
}
scanf("%d", &n);
while(n--) {
scanf("%d %d", &tx, &ty);
printf("%d\n", solve(tx,ty));
}
}
int solve(int x, int y) { //带入四种情况求出答案
int a, b, c, d;
a = x - y + r[0];
b = x + y + r[1];
c = -x - y + r[2];
d = -x + y + r[3];
return max(a,max(b,max(c,d)));
}
int main() {
int T;
scanf("%d", &T);
while(T--) {
init();
input();
}
return 0;
}