zoukankan      html  css  js  c++  java
  • [BZOJ]1045 糖果传递(HAOI2008)

      放一道数学题。

    Description

      有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。

    Input

      第一行一个正整数n<=1000000,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数。

    Output

      求使所有人获得均等糖果的最小代价。

    Sample Input

      4
      1
      2
      5
      4

    Sample Output

      4

    HINT

      n<=1000000,ai在int范围内。

    Solution

      这道题也算是一个经典的绝对值最值模型吧。(小C会说刚拿到这道题拿费用流跑二分图匹配?)

      其实不要想着把一个地方的糖果搬到另一个地方去,我们要把题目化简:

      整个过程都可以看作是一个小朋友向相邻的小朋友传递/接受糖果,

      所以我们很自然地设pi为第i个小朋友向第i-1个(i+1亦可)小朋友传递的糖果数。pi可以为负(就变成了接收的糖果数)。

      所以我们要使答案最小。

      重点来了!看到求绝对值之和最小的式子,根据我们的知识储备,我们推测它和中位数有关。

      可是这里面有n个变量,我们要想办法把它化成只含一个变量的式子。我们开始推式子:

      设ai的平均数为aver,我们有(显而易见的)n个等式:

          ······①

          ······②

        ……

        

      我们观察到,p2其实就是p1加上一个常数;而p3又是p2加上一个常数,所以p3就是p1加上一个常数!

      同理p1~pn都可以用形如p1+d(d为常数)的式子来表示。

      所以设,所以我们只要求的最小值!

      这时候就可以用到我们的知识储备,p1只要取di的中位数的相反数就可以使答案最小!

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define ll long long
    #define MN 1000005
    using namespace std;
    int n;
    ll a[MN],b[MN],sum,lt,ans;
    
    inline int read()
    {
        int n=0,f=1; char c=getchar();
        while (c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}
        while (c>='0' && c<='9') {n=n*10+c-'0'; c=getchar();}
        return n*f;
    }
    
    int main()
    {
        register int i;
        n=read();
        for (i=1;i<=n;++i) sum+=a[i]=read();
        sum/=n;
        for (i=1;i<n;++i) b[i+1]=b[i]+sum-a[i];
        sort(b+1,b+n+1);
        lt=-b[n+1>>1];
        for (i=1;i<=n;++i) ans+=abs(lt+b[i]);
        printf("%lld",ans);
    }

    Last Word

      关于数学的最值问题,这种题型只是其中之一,小C以后见到了可能还会继续更新。

  • 相关阅读:
    超星电子书下载攻略
    快速生成PDF书签
    2016抢票软件分享
    Win10安装framework3.5
    .NET破解之分享给新注册的朋友
    封装JedisClient.提供API实现对redis的操作
    java操作redis集群配置[可配置密码]和工具类
    redis 集群java.lang.NoSuchMethodError:SpringJAR包版本冲突错误解决方法
    linux端口开放指定端口的两种方法
    redis requires ruby version 2.2.2的解决方案
  • 原文地址:https://www.cnblogs.com/ACMLCZH/p/7417880.html
Copyright © 2011-2022 走看看