欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

CH - 0501 货仓选址(中位数)

发布时间:2024/4/11 编程问答 65 豆豆
生活随笔 收集整理的这篇文章主要介绍了 CH - 0501 货仓选址(中位数) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

题目链接:点击查看

题目大意:在一条数轴上有N家商店,它们的坐标分别为 A[1]~A[N]。现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。

题目分析:中位数应用最经典的问题之一了,我们设应该将货仓建立在坐标X处,现在X左边有P家商店,X右边有Q家商店,我们需要尽可能的让P=Q才是最优解

这样问题就转换成了求整个序列的中位数了

然后说一下蓝书上给出的结论吧(对于序列a已经排好序):

  • 当n为奇数时,货仓建在a[n/2+1]处最优
  • 当n为偶数时,货仓建在a[n/2]~a[n/2+1]之间(包含端点)的任意位置都是最优
  • 这样一来,为了方便书写,我们不妨设a[(n+1)/2]作为中位数,就能都满足奇偶的两个条件了,也不用分类讨论了

    代码:

    #include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;int a[N];int main() { // freopen("input.txt","r",stdin); // ios::sync_with_stdio(false);int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",a+i);sort(a+1,a+1+n);int temp=a[(n+1)/2];LL ans=0;for(int i=1;i<=n;i++)ans+=llabs(temp-a[i]);cout<<ans<<endl;return 0; }

     

    总结

    以上是生活随笔为你收集整理的CH - 0501 货仓选址(中位数)的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。