首页 > 代码库 > BZOJ 3210 花神的浇花集会 切比雪夫距离

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;
}


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