
点击查看代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int n, res;
int a[N];
int main()
{
cin >> n;
for (int i = 0; i < n; i ++) cin >> a[i];
sort(a, a + n);
int t = a[n / 2];
for (int i = 0; i < n; i ++) res += abs(t - a[i]);
cout << res << endl;
return 0;
}
- 算法思路
最优位置是所有数的中位数,分为奇数个和偶数个两种情况:
① 若数的个数是奇数,中位数唯一
② 若数的个数是偶数,取中间的两个数其中之一即可
- 最优性证明
设距离之和为 f ,xi 为第 i 个点的坐标,x1⩽x2⩽⋯⩽xn ,
f=|x1−x|+|x2−x|+⋯+|xn−x|=(|x1−x|+|xn−x|)+(|x2−x|+|xn−1−x|+⋯)⩾(xn−x1)+(xn−1−x2)+⋯
取等号的前提是 x 位于区间 [x1,xn],[x2,xn−1],⋯ 的内部,x 位于中位数的位置
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!