欧氏距离:两点直接线段最短

曼哈顿距离:直角距离

例:二维平面上两点距离

python 切比雪夫距离意义 什么是切比雪夫距离_bzoj

切比雪夫距离:一致范数所衍生的度量,又称L∞度量

先看例子:二位平面上两点切比雪夫距离为

python 切比雪夫距离意义 什么是切比雪夫距离_python 切比雪夫距离意义_02

(国际象棋中国王从A点到达B点所要走的步数即两者的切比雪夫距离)

n维平面(x1, x2, x3…xn)上的两点切比雪夫距离为

python 切比雪夫距离意义 什么是切比雪夫距离_bzoj_03

该公式等价于

python 切比雪夫距离意义 什么是切比雪夫距离_#include_04

但是描述两点的不一定只有坐标,还有其他的东西,令pi为空间p点(or向量p or其它)的其中一个度量,qi同理

那么两者之间的切比雪夫距离就定义为

python 切比雪夫距离意义 什么是切比雪夫距离_#include_05

这也等于以下Lp度量的极值

python 切比雪夫距离意义 什么是切比雪夫距离_python 切比雪夫距离意义_06




3210: 花神的浇花集会

Time Limit: 1 Sec  Memory Limit: 128 MB


Submit: 633  Solved: 330


[

Submit][

Status][

Discuss]


Description


在花老师的指导下,每周4都有一个集会活动,俗称“浇水”活动。

具体浇水活动详情请见BZOJ3153

但这不是重点

花神出了好多题,每道题都有两个参考系数:代码难度和算法难度

花神为了准备浇花集会的题,必须找一道尽量适合所有人的题

现在花神知道每个人的代码能力x和算法能力y,一道题(代码难度X算法难度Y)对这个人的不适合度为    Max ( abs ( X – x ) , abs ( Y – y ) )

也就是说无论太难还是太简单都会导致题目不适合做(如果全按花神本人能力设题,绝对的全场爆0的节奏,太简单,则体现不出花神的实力)

当然不是每次都如花神所愿,不一定有一道题适合所有人,所以要使所有人的不合适度总和尽可能低

花神出了100001*100001道题,每道题的代码难度和算法难度都为0,1,2,3,……,100000


Input


第一行一个正整数N,表示花神有N个学生,花神要为这N个学生选一道题

接下来N行,每行两个空格隔开的整数x[i],y[i],表示这个学生的代码能力和算法能力


Output


一个整数,表示最小的不合适度总和


Sample Input


3


1 2


2 1


3 3


Sample Output


3




题目的意思就是:给你n个点的坐标,让你找出一个点使得这个点到所有点的切比雪夫距离和最小

可以转化成曼哈顿距离求解

公式:

python 切比雪夫距离意义 什么是切比雪夫距离_bzoj_07

逆变换就好了,就成了切比雪夫距离转曼哈顿距离

也就是将每个点的坐标更新为(x+y, x-y),然后再分别找x和y的中位数即是答案坐标

但是找到的坐标也是变换过的,按道理来讲,x+y和x-y的奇偶性应该相同,如果答案的坐标奇偶性不同,则说明变换前不是整点,这个时候要判断答案附近的四个点最优的是哪个


#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
using namespace std;
int x[100005], y[100005], dir[4][2] = {1,0,0,1,-1,0,0,-1};
int main(void)
{
	int n, i, ax, j, ay, dx, dy;
	long long ans, sum;
	while(scanf("%d", &n)!=EOF)
	{
		for(i=1;i<=n;i++)
		{
			scanf("%d%d", &dx, &dy);
			x[i] = dx+dy;
			y[i] = dx-dy;
		}
		sort(x+1, x+n+1);
		sort(y+1, y+n+1);
		ax = x[(n+1)/2], ay = y[(n+1)/2];
		ans = 0;
		if(ax%2==0 && ay%2==0 || ax%2==1 && ay%2==1)
		{
			for(i=1;i<=n;i++)
				ans += abs(ax-x[i])+abs(ay-y[i]);
			printf("%lld\n", ans/2);
		}
		else
		{
			for(i=0;i<=3;i++)
			{
				sum = 0;
				dx = ax+dir[i][0];
				dy = ay+dir[i][1];
				for(j=1;j<=n;j++)
					sum += abs(dx-x[j])+abs(dy-y[j]);
				ans = min(ans, sum);
				if(ans==0)
					ans = sum;
			}
			printf("%lld\n", ans/2);
		}
	}
	return 0;
}