题目大意:平面上一些点,求一个点到所有点的切比雪夫距离只和最小。
思路:和那个松鼠的题目比较像,但是松鼠的那个是求的点是所有点中的一个点,而这个题却不一定。和那个题一样,将横纵坐标分别排序,然后取中位数统计。但是有可能会出现小数,因此随即调整一下,取最小值就行了。
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;
}