## q184. 分組開會 ###### 2025年1月 ### 主要考點:滑動窗口 ### 解題思路: #### 1.對於長度k的已排序陣列a,使|x-a1|+|x - a2| + |x - a3| + ... + |x-a(k-1)|+|x - ak|達到最小值,x必為第a(k//2+1)個數。 #### 2. 利用固定大小的滑動窗口計算最小成本。先算出最左邊的成本,之後之要扣掉最左邊的成本再加上最右邊的成本就是新窗口的成本。 #### 3.如果現在左邊已經有到達k,代表出現合法的左右成本,開始計算最小成本。 #### 4.每次會往右移動,要檢查最小右成本是否依舊在合法範圍內。 ### 解題步驟 #### 1.讀入n、k、座標、變數初始化 #### 2.排序座標(小到大) #### 3.計算第一次成本 #### 4.使用滑動窗口計算成本 #### 5.不斷更新最小成本 #### 6.輸出答案 ### 解答 ```python= n,k=map(int,input().split()) place=sorted(list(map(int,input().split()))) cost,costs=0,[]#儲存目前成本以及全部成本 min_cost=min_left=min_right=float("inf") #↑最小總成本,最小左成本,最小右成本(合法條件:與左邊不重疊) min_rights=[] for index in range(k):cost+=abs(place[k//2]-place[index])#計算最一開始的成本 costs.append(cost)#添加計算結果 for left in range(1,n-k+1): cost-=abs(place[left+(k)//2-1]-place[left-1]) cost+=abs(place[left+(k-1)//2]-place[left+k-1]) #↑加上新的右成本(新的中點為left+(k-1)//2,避免k為偶數的誤差。) costs.append(cost)#儲存結果 if left>=k:#開始有合法右成本 min_left=min(min_left,costs[left-k])#計算最小左成本 min_right=min(min_right,cost)#計算最小右成本 min_rights.append(cost) if left>=k+1: if min_right==min_rights.pop(0):min_right=min(min_rights) #↑刪掉重疊的右成本並檢查是否需要新的右成本 min_cost=min(min_cost,min_left+min_right)#更新最小成本 print(min_cost) ```