## 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)
```