BZOJ 3210 花神的浇花集会 切比雪夫距离

题目大意:平面上一些点,求一个点到所有点的切比雪夫距离只和最小。


思路:和那个松鼠的题目比较像,但是松鼠的那个是求的点是所有点中的一个点,而这个题却不一定。和那个题一样,将横纵坐标分别排序,然后取中位数统计。但是有可能会出现小数,因此随即调整一下,取最小值就行了。


CODE:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 100010
using namespace std;
#define min(a,b) ((a) < (b) ? (a):(b))
 
int X[MAX],Y[MAX];
 
struct Point{
    int x,y;
     
    void Read(int p) {
        scanf("%d%d",&x,&y);
        X[p] = x + y;
        Y[p] = x - y;
    }
}point[MAX];
 
int points;
 
inline long long GetAns(int x,int y)
{
    long long re = 0;
    for(int i = 1; i <= points; ++i)
        re += abs(x - X[i]) + abs(y - Y[i]);
    return re;
}
 
int main()
{
    cin >> points;
    for(int i = 1; i <= points; ++i)
        point[i].Read(i);
    sort(X + 1,X + points + 1);
    sort(Y + 1,Y + points + 1);
    int x = X[(points + 1) >> 1],y = Y[(points + 1) >> 1];
    if((x&1 && y&1) || (!(x&1) && !(y&1)))
        cout << GetAns(x,y) / 2 << endl;
    else
        cout << min(min(GetAns(x + 1,y),GetAns(x,y + 1)),min(GetAns(x - 1,y),GetAns(x,y - 1))) / 2 << endl;
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值