题目描述
草原上住着一群小松鼠,每个小松鼠都有一个家。时间长了,大家觉得应该聚一聚。但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理。
每个小松鼠的家可以用一个点x,y表示,两个点的距离定义为点(x,y)和它周围的8个点(x-1,y)(x+1,y),(x,y-1),(x,y+1).(x-1,y+1),(x-1,y-1),(x+1,y+1),(x+1,y-1)距离为1。
输入输出格式
输入格式: 第一行是一个整数N,表示有多少只松鼠。接下来N行,第i行是两个整数x和y,表示松鼠i的家的坐标
输出格式: 一个整数,表示松鼠为了聚会走的路程和最小是多少。
输入输出样例
输入样例#1: 6-4 -1-1 -22 -40 20 35 -2
输入样例#2: 60 02 0-5 -22 -2-1 24 0
说明
样例解释
在第一个样例中,松鼠在第二只松鼠家(-1,-2)聚会;在第二个样例中,松鼠在第一只松鼠家(0.0)聚会。
数据范围
30%的数据,0 ≤ N ≤ 1000
100%的数据,0 ≤ N ≤ 100000; −10^9 ≤ x, y ≤ 10^9
首先我们要求的是 切比雪夫距离。
也就是 dis=max( |dx|,|dy|);
看样子可能不太好求解;
想办法转换为 曼哈顿距离;
在(x,y)坐标系中进行变换----> ( (x+y)/2,(x-y)/2 );
可以发现原坐标系中的 切比雪夫距离 就是新坐标系中的 曼哈顿距离 ;
(推一下即可);
那么我们考虑用 曼哈顿距离求解:
∑Mdis(i,k) 即该值最小;
将其变为有序方便处理(不妨设为升序);
即 Mdis(1,i)+Mdis(2,i)+...+Mdis(n,i)
现以X坐标为例:
即 x[ i ]-x[ 1 ]+x[ i ]-x[ 2 ]+...+x[ i+1 ]-x[ i ]+...x[ n ]-x[ i ]
= i*x[ i ]- sum[ i ]+sum[ n ]-sum[ i ]+(n-i)*x[ i ];
那么就可以用前缀和进行维护了;
#include #include #include #include #include #include #include #include