蓝书(算法竞赛进阶指南)刷题记录——CH0501 货仓选址

版权声明:转载请注明原出处啦(虽然应该也没人转载): https://blog.csdn.net/hzk_cpp/article/details/81988787

题目:0501 货仓选址.

题目大意:给定一根数轴,以及n个坐标A[i],选出一个数x,使得x到所有A[i]的距离和最短.

这道题是一道贪心,我们发现平均数并不能很好的解决这个问题,而众数也不行.

但是我们突然发现中位数可以,所以我们选定它们的中位数为x.

至于为什么中位数一定是最优的,证明如下:

设点x前面有P个点,x后面有Q个点,则当x往后移一格,会使总和增大P-Q.

那么很容易发现,当P=Q时,答案最优.

证毕.

那么代码如下:

#include<bits/stdc++.h>
  using namespace std;
#define Abigail inline void
typedef long long LL;
const int N=100000;
int a[N+9],n;
LL sum;
Abigail into(){
  scanf("%d",&n);
  for (int i=1;i<=n;i++)
    scanf("%d",&a[i]);
}
Abigail work(){
  sort(a+1,a+1+n);
  for (int i=1;i<=n;i++)
    sum+=(LL)(abs(a[i]-a[1+n>>1]));
}
Abigail outo(){
  printf("%lld\n",sum);
}
int main(){
  int T=1;
  while (T--){
    into();
    work();
    outo();
  }
  return 0;
}

猜你喜欢

转载自blog.csdn.net/hzk_cpp/article/details/81988787