問題描述
在乙個平面上有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...