欧氏距离:两点直接线段最短
曼哈顿距离:直角距离
例:二维平面上两点距离
切比雪夫距离:一致范数所衍生的度量,又称L∞度量
先看例子:二位平面上两点切比雪夫距离为
(国际象棋中国王从A点到达B点所要走的步数即两者的切比雪夫距离)
n维平面(x1, x2, x3…xn)上的两点切比雪夫距离为
该公式等价于
但是描述两点的不一定只有坐标,还有其他的东西,令pi为空间p点(or向量p or其它)的其中一个度量,qi同理
那么两者之间的切比雪夫距离就定义为
这也等于以下Lp度量的极值
在花老师的指导下,每周4都有一个集会活动,俗称“浇水”活动。
具体浇水活动详情请见BZOJ3153
但这不是重点
花神出了好多题,每道题都有两个参考系数:代码难度和算法难度
花神为了准备浇花集会的题,必须找一道尽量适合所有人的题
现在花神知道每个人的代码能力x和算法能力y,一道题(代码难度X算法难度Y)对这个人的不适合度为 Max ( abs ( X – x ) , abs ( Y – y ) )
也就是说无论太难还是太简单都会导致题目不适合做(如果全按花神本人能力设题,绝对的全场爆0的节奏,太简单,则体现不出花神的实力)
当然不是每次都如花神所愿,不一定有一道题适合所有人,所以要使所有人的不合适度总和尽可能低
花神出了100001*100001道题,每道题的代码难度和算法难度都为0,1,2,3,……,100000
第一行一个正整数N,表示花神有N个学生,花神要为这N个学生选一道题
接下来N行,每行两个空格隔开的整数x[i],y[i],表示这个学生的代码能力和算法能力
一个整数,表示最小的不合适度总和
题目的意思就是:给你n个点的坐标,让你找出一个点使得这个点到所有点的切比雪夫距离和最小
可以转化成曼哈顿距离求解
公式:
逆变换就好了,就成了切比雪夫距离转曼哈顿距离
也就是将每个点的坐标更新为(x+y, x-y),然后再分别找x和y的中位数即是答案坐标
但是找到的坐标也是变换过的,按道理来讲,x+y和x-y的奇偶性应该相同,如果答案的坐标奇偶性不同,则说明变换前不是整点,这个时候要判断答案附近的四个点最优的是哪个
#include
#include
#include
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;
}