[AcWing 104] 货仓选址

image


点击查看代码
#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;
}

  1. 算法思路
    最优位置是所有数的中位数,分为奇数个和偶数个两种情况:
    ① 若数的个数是奇数,中位数唯一
    ② 若数的个数是偶数,取中间的两个数其中之一即可
  2. 最优性证明
    设距离之和为 fxi 为第 i 个点的坐标,x1x2xn
    f=|x1x|+|x2x|++|xnx|=(|x1x|+|xnx|)+(|x2x|+|xn1x|+)(xnx1)+(xn1x2)+
    取等号的前提是 x 位于区间 [x1,xn],[x2,xn1], 的内部,x 位于中位数的位置
posted @   wKingYu  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
欢迎阅读『[AcWing 104] 货仓选址』
点击右上角即可分享
微信分享提示