卧薪尝胆,厚积薄发。
花神的浇花集会
Date: Tue Sep 11 19:35:17 CST 2018
In Category:
NoCategory
Description:
给你
$n$
个点,要你求一个整点,使得该点到所有给定的点的切比雪夫距离最小。
$1\le n \le 100000$
Solution:
先把切比雪夫距离转化成曼哈顿距离,则最后的答案为
$\begin{align}\sum_{i=1}^n|x-x_i'|+|y-y_i'|\end{align}$
。
可以把横纵坐标分开来考虑,那么问题就变成了
$\begin{align}\sum_{i=1}^n|x-x_i'|+\sum_{i=1}^n|y-y_i'|\end{align}$
,在一维上,就变成了一个中位数最优问题,但是有一个问题,就是找到的两个数不一定在原坐标系下是整点,由
$(x',y')=(\frac {x+y}2,\frac{x-y}2)$
发现只有
$x$
与
$y$
奇偶性相同时才是整点,而如果这个点不是整点,那他在曼哈顿距离坐标系下上下左右四个点在原坐标系下是整点,枚举一下判断即可。
Code:
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int n;
#define MAXN 100010
struct point
{
int x,y;
}p[MAXN];
int x[MAXN],y[MAXN];
int mx[4] = {0,0,1,-1};
int my[4] = {1,-1,0,0};
int main()
{
scanf("%d",&n);
for(int i = 1;i <= n;++i)
{
scanf("%d%d",&p[i].x,&p[i].y);
x[i] = p[i].x + p[i].y;y[i] = p[i].x - p[i].y;
p[i].x = x[i];p[i].y = y[i];
}
sort(x + 1,x + 1 + n);
sort(y + 1,y + 1 + n);
int nx = x[(n + 1) >> 1],ny = y[(n + 1) >> 1];
if(((nx ^ ny) & 1) == 0)
{
long long ans = 0;
for(int i = 1;i <= n;++i)
{
ans += abs(nx - p[i].x) + abs(ny - p[i].y);
}
cout << ans / 2 << endl;
return 0;
}
long long ans = 0x3f3f3f3f3f3f3f3f;
for(int k = 0;k < 4;++k)
{
int sx = nx + mx[k],sy = ny + my[k];
long long res = 0;
for(int i = 1;i <= n;++i)
{
res += abs(sx - p[i].x) + abs(sy - p[i].y);
}
ans = min(ans,res);
}
cout << ans / 2 << endl;
return 0;
}
In tag:
数学-曼哈顿距离与切比雪夫距离 其他-中位数最优
Copyright © 2020
wjh15101051
ღゝ◡╹)ノ♡