雜題 Tjoi 2013 松鼠聚會

2021-08-09 12:12:00 字數 1135 閱讀 3591

問題 f: [tjoi 2013]松鼠聚會

時間限制: 1 sec 記憶體限制: 128 mb

提交: 70 解決: 35

[提交][狀態][討論版]

題目描述

有n個小松鼠,它們的家用乙個點x,y表示,兩個點的距離定義為:點(x,y)和它周圍的8個點即上下左右四個點和對角的四個點,距離為1。現在n個松鼠要走到乙個松鼠家去,求走過的最短距離。

輸入 第一行給出數字n,表示有多少只小松鼠。0<=n<=10^5

下面n行,每行給出x,y表示其家的座標。

-10^9<=x,y<=10^9

輸出 表示為了聚會走的路程和最小為多少。

樣例輸入

6 -4 -1

-1 -2

2 -4

0 2

0 3

5 -2

樣例輸出

20題目中要求的是切比雪夫距離,但這個太麻煩了。其實切比雪夫距離是可以轉化成曼哈頓距離的,切比雪夫距離公式:s=max(ax-bx,ay-by)等於(ax+ay,ax-ay)和(bx+by,bx-by)兩點的曼哈頓距離。想要證明只要把那個曼哈頓距離求出來化簡即可。

那麼就容易了,搞乙個字首和,二分出做減法的邊界,掃一遍就行了。

#include

#include

#include

#include

#include

#define n 100005

#define inf 1000000000

#define ll long long

struct nodea[n];

int n,mn=inf,mx=-inf,bx[n],by[n];ll ans=inf*10000000ll,sumx[n],sumy[n];

using namespace std;

int main()

sort(bx+1,bx+n+1);

sort(by+1,by+n+1);

for(int i=1;i<=n;i++)

sumx[i]=sumx[i-1]+bx[i],sumy[i]=sumy[i-1]+by[i];

for(int i=1;i<=n;i++)

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 ...

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 1 x 1...

3170 Tjoi 2013 松鼠聚會

題目鏈結 題目大意 給定平面上的n個點,求這n個點中的乙個點,使其到這n個點的切比雪夫距離之和最小 題解 根據結論 把座標系旋轉45 曼哈頓距離轉化成切比雪夫距離,把點 x y 變成 x y,x y 這樣新點之間的切比雪夫距離就是原點之間的曼哈頓距離 同理可以把切比雪夫距離轉化成曼哈頓距離,把點 x...