p3964
首先學習一下曼哈頓距離和切比雪夫距離即二者之間的轉換。
那根據切比雪夫距離的定義,只要x, y這個點到它周圍八個點的距離都是一的話,就是使用的切比雪夫距離。
對於給出的n個點,選擇其中乙個點並計算它到其他點的距離的話,由於切比雪夫距離定義為:d = max(|x1 - x2|,|y1 - y2|)。計算所有點到當前點距離的時間複雜度為o(n)。那n個點就是o(n2)。時間上來說並不理想。
我們可以把給出的座標轉換為曼哈頓距離,曼哈頓距離的定義是d = |x1 - x2| + |y1 - y2|。對於xi來說所有點到他的距離為 d = |x1 - xi| + |x2 - xi| + … + |xn - xi|
通過對所有點的x進行排序,就可以將公式裡的絕對值去掉。
式子變為了 d = xi - x1 + xi - x2 +… + xi - xi + xi+1 - xi + … + xn - xi 也就是位置i之前的全變為xi減去當前點x值,i後面的全都不變。
再進行整理得到
進行一次遍歷找到最小的距離即可,在轉換的時候,可以先不除二,為了避免浮點數運算。在求出距離後再對距離除二即可。
#include
#include
using
namespace std;
typedef
long
long ll;
struct node
;struct node a[
100010];
ll x[
100010
], y[
100010];
ll sumx[
100010
],sumy[
100010];
intmain()
sort (x+
1, x+n+1)
; sort (y+
1, y+n+1)
;for
(int i=
1; i<=n; i++)
ll minnum =
8e18
;for
(int i=
1; i<=n; i++)
cout << minnum /
2<< endl;
return0;
}
P3964 松鼠聚會(切比雪夫距離模板)
將乙個點 x,y 的座標變為 x y,x y 後,原座標系中的曼哈頓距離 新座標系中的切比雪夫距離 將乙個點 x,y 的座標變為 x y 2,x y 2 後,原座標系中的切比雪夫距離 新座標系中的曼哈頓距離 切比雪夫距離 max dx,dy include using namespace std t...
松鼠的聚會
有若干只松鼠住在可視為笛卡爾座標系的草原上,它們想選定其中乙隻的家作為目的地去參加聚會,並且不希望走太長距離,請你求出最小距離.值得注意的是,乙個點到其周圍八個點距離均為 1 此題我們不難發現,任意兩點間的距離為兩點間橫縱座標差的絕對值的較大值,我們一般將這種距離叫做切比雪夫距離.其實,笛卡爾座標系...
TJOI2013 松鼠聚會
題目描述 草原上住著一群小松鼠,每個小松鼠都有乙個家。時間長了,大家覺得應該聚一聚。但是草原非常大,松鼠們都很頭疼應該在誰家聚會才最合理。每個小松鼠的家可以用乙個點x,y表示,兩個點的距離定義為點 x,y 和它周圍的8個點 x 1,y x 1,y x,y 1 x,y 1 x 1,y 1 x 1,y ...