題目連結: https://onlinejudge.org/external/100/10041.pdf
平台:
有一個黑幫老大 Vito 要去拜訪親戚,要找一間房子,離所有親戚的屋子距離最短。
第一行會先有一數字 代表總共測資的數量。接著會有 行測資輸入,每筆測資的第一的數字 代表親戚的數量,接著會有 個數字 代表每個親戚所在的街道號碼。
找到老大家後,印出老大家到所有親戚家的最短路徑和。
由於是給一組數字 ,然後要找出一個數字 對於所有數字的差的和。所以可以整理成以下式子, 就是我們最後要輸出的值。
找到 的方法最簡單就是利用中位數的概念。
中位數
給定一排序過的集合 , 的中位數 為:
讀入測資後用 qsort()
排序,找出中位數。並依序求到各點的距離和。
若依照原本的敘述進行中位數的實作,程式碼如下:
但由於是求到各點距離總和,我們可以簡化一下:
假設輸入測資為 ,其大小 ,中位數 。
到各點的最短距離和 :
我們可以發現在中位數對稱的兩項,可以合併在一起。
對所有 且
就會如下圖所示( 用 o
表示,|
表示 、):
可以看到,無論 在 的範圍內的哪個位置,成對的距離相加都不變。但為了要符合 中每組成對的距離, 只能是 或 。
也因此可以把中位數的程式簡化成以下:
時間複雜度:
假設
qsort()
實作為
空間複雜度: