1. 程式人生 > 實用技巧 >(阿里巴巴筆試題)直線上安裝水塔,水塔到直線上其它點的距離之和最小

(阿里巴巴筆試題)直線上安裝水塔,水塔到直線上其它點的距離之和最小

直線上有N棵樹木,需要在直線上修水塔,使水塔到所有樹木的距離最短,時間複雜度為O(N)。(水塔的安裝位置在整數處,安裝水塔的位置不能有樹木)

輸入:第一行 樹的數目N。第二行N棵數目的座標值

2<=N<=10^5,

樹木的座標0<=ai<=2^31

輸入:

4

0 1 4 6

輸出:

9

解釋:在第三個位置上修水塔,距離為3+2+1+3=9

if __name__ == "__main__":

    N = int(input())
    data = list(map(int,input().split()))
    data = sorted(data)
    
# N = 4 # data = [0, 1, 4, 6] dis = [0 for i in range(min(data), max(data) + 1)] dis[0] = 0 for ele in data: dis[0] += abs(min(data) - ele) left = 1 right = N - 1 for idx, i in enumerate(range(min(data) + 1, max(data) + 1)): # 向右移動一個點,右邊所有點的距離減去1,左邊所有點的距離加1 if
i in data: dis[idx + 1] = dis[idx] + left - right left += 1 right -= 1 else: dis[idx + 1] = dis[idx] + left - right # # 最後因為有樹木的地方不能修水塔,需要刪除 # # dis的索引為0,max[data]-min(data) # # 對應著座標為min(data)到max[data]位置安裝水塔計算距離的最小值 # idx = list(map(minus,data))
# cur_idx = 0 # flag = False # for i in range(len(dis)): # if i not in idx: # flag = True # if flag: # dis[cur_idx] = dis[i] # cur_idx += 1 # print(min(dis)) # 不刪除,自己計算最小值,和對應的索引 min_v=dis[0] min_idx=0 print(dis) for idx,ele in enumerate(dis): if ele <min_v and idx+min(data) not in data: min_v=ele min_idx=idx
   print(min_v)
   #print(str(min_idx+min(data)),str(min_v)) pass