选址问题
内存限制: 256 Mb时间限制: 1000 ms
题目描述
在一条直线上,有 n 个人,其中第 i 个人在直线上的坐标为 xi。
请在直线上,找到一个聚会点,聚会点可以在直线的任何位置上,使得所有人到达这个聚会点的路程之和达到最小。输出这个最小值。
输入格式
- 单个整数:表示 n
- n 个整数:表示 x1 到 xn
输出格式
数据范围
- 30% 的数据,1≤n≤100
- 60% 的数据,1≤n≤5,000
- 100% 的数据,1≤n≤100,000
- −20,000≤xi≤20,000
样例数据
输入:
5
3 1 4 1 5
输出:
7
解析:选中位数最小,详见代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int a[100005];
long long ans = 0;
int main() {
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> a[i];
}
sort(a + 1, a + n + 1); //排序
int ave = a[(n + 1) / 2]; //取中位数
for(int i = 1; i <= n; i++) { //循环求距离和
ans += abs(ave - a[i]);
}
cout << ans;
return 0 ;
}