平面上的郵局

2021-07-11 14:36:32 字數 1321 閱讀 1210

問題描述

在乙個平面上有n(1<=n<=100000)個村莊,每個村莊通過座標(xi,yi)標示位置,-10^9<=xi,yi<=10^9。現在想要建乙個郵局,使得到各個村莊的距離之和最短。

在這個問題中,距離定義為曼哈頓距離,即點i和點j的距離等於|xi-xj|+|yi-yj|

輸入第一行為n,表示村莊的數量

接下來n行每行有兩個整數,表示乙個村莊的座標

輸出乙個數字,表示建立的郵局到各個村莊的和

村莊和郵局的座標都一定為整數

對於超過int的數字,請用long long,輸入和讀取用%lld

測試輸入

期待的輸出

時間限制

記憶體限制

額外程序

測試用例 1

以文字方式顯示

3↵0 0↵

10 10↵

0 10↵

以文字方式顯示

20↵無限制64m0

題解思路

整體思路:

由於是要找到郵局到各個村莊的最小距離之和,即求曼哈頓距離。這時可以考慮對x,y座標分別進行距離求解,即所有x,y座標排序之後的中間數就是郵局的位置,然後就是累和計算。

具體實現:

(1) 可以使用快排對x,y座標分別進行排序,找到中位數。也可以使用結構體對x,y座標分別進行排序找到中位數。找到中位數之後進行累和,就是用中位數減去各個座標的值然後 求絕對值累和。

(2)因為題目中沒有要郵局的位置,只是讓求距離之和,所以可以這樣計算。先將x,y使用快排按順序排好。然後用最大值減去最小值,第二大值減去第二小值,依次類推。

例如如果對於一組數

1  2  3  4  5  6  7  按照第一種方法我們找到中位數是4,然後需要計算4-1+4-2+4-3+4-4+5-4+6-4+7-4=12;將上面的式子整理一下就是4-1+7-4+4-2+6-4+4-3+5-3+4-4=7-1+6-2+5-3+4-4=12.即為下面的第二種方法,這樣計算的話可以省去中間的判斷步驟。

實現**

#include #include #include long long x[1000001];

long long y[1000001];

int cmp( const void *a,const void *b )

int main()

{ long n,i,j,xx,yy;

long long s=0,temp;

scanf("%ld",&n);

for(i=0;i

平面中用到的公式(點到平面的距離 平面上的最近點)

點到平面的距離 設想乙個平面和乙個不在平面上的點qv 後面加v表示向量 平面上存在乙個點pv,它到qv的距離最短。很明顯,從pv到qv的向量垂直於平面,且形式為a nv 就是說這個向量差與平面法矢平行,因為nv是單位向量,所以其長度就是a 假設nv為單位向量,那麼pv到qv的距離 也就是qv到平面的...

平面上的點 Point類 IV

description 在數學上,平面直角座標系上的點用x軸和y軸上的兩個座標值唯一確定。現在我們封裝乙個 point類 來實現平面上的點的操作。介面描述 showpoint 函式 按輸出格式輸出point物件,呼叫point show 方法實現。point show 方法 按輸出格式輸出point...

平面上的點 Point類 V

description 在數學上,平面直角座標系上的點用x軸和y軸上的兩個座標值唯一確定。現在我們封裝乙個 point類 來實現平面上的點的操作。介面描述 showpoint 函式 按輸出格式輸出point物件。point show 方法 按輸出格式輸出point物件。point showsumof...