校OJ P1411 -- 相亲


如果使用常规思路记录所有婚介所的距离,之后每输入一个坐标再去遍历一遍婚介所并计算出距离的话,根据题目所给的数据规模来看,这题肯定是会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;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值