# TIOJ-1732.買當勞
## 題敘:
在一條無線長的路上住著一些人,
可以把這條路想成一條數線, 這些人所在的位置就是一些整數
買當勞想要在這條路上開一家店,
買當勞可以在任何一個位置開店 (即使那個位置原先有住人)
不過買當勞希望可以選一個好位置, 使得大家來到這邊平均來說是最方便的
所謂最方便指的是, 每個人來到買當勞需要走的距離總和最小
例如如果有四個人分別住在 12, 7, -13, 100 這四個位置
那買當勞可以考慮在 10 這個位置開店
這樣第一個人(12)要走得距離是 2
第二個人(7)要走得距離是 3
第三個人(-13)要走得距離是 23
第四個人(100)要走得距離是 90
距離總就是 2 + 3 + 23 + 90 = 118, 這是一個最小的方案。
現在告訴你總共有 n 個人,
並分別給你他們在這條路上的位置
**請問在最佳情形下, 所有人走到買當勞的距離總和最小是多少?**
## Input&Output Format、Sample
**Input:**
(Format)
輸入有多組測試資料!! 以EOF作為結尾。
每組測試資料第一行有一個整數 n
接下來一行有 n 個整數, 代表這 n 個人的位置。
n <= 100000
(Sample)
1
3
2
1 2
4
12 7 -13 100
**Output:**
(Format)
輸出一個整數代表最小距離總和。
你可以假設答案距離總和不會超過 int 範圍。
(Sample)
0
1
118
## AC code及思路
**想法:**
Greedy演算法,將麥當勞的位置設於中位數,即可得到最小的距離和。
**AC code:**
```cpp=
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, a, mid, ans;
vector <int> v;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
while (cin >> n){
v.clear();
for (int i = 0; i < n; i++){
cin >> a;
v.push_back(a);
}
sort(v.begin(), v.end());
ans = 0;
mid = v[n/2];
for (int i = 0; i < n; i++){
ans += abs(v[i]-mid);
}
cout << ans << "\n";
}
}
```