zoukankan      html  css  js  c++  java
  • P4016 负载平衡问题

    题目描述

    GG 公司有 nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等。如何用最少搬运量可以使 nn 个仓库的库存数量相同。搬运货物时,只能在相邻的仓库之间搬运。

    输入输出格式

    输入格式:

    文件的第 11 行中有 11 个正整数 nn ,表示有 nn 个仓库。

    第 22 行中有 nn 个正整数,表示 nn 个仓库的库存量。

    输出格式:

    输出最少搬运量。

    输入输出样例

    输入样例#1: 复制
    5
    17 9 14 16 4
    输出样例#1: 复制
    11

    说明

    1n100

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    
    const int N=1e6+5;
    
    int n,s;
    long long a[N],sum[N],ave;
    
    inline long long read()
    {
        char c=getchar();long long num=0;
        for(;!isdigit(c);c=getchar());
        for(;isdigit(c);c=getchar())
            num=num*10+c-'0';
        return num;
    }
    
    int main()
    {
        n=read();
        for(int i=1;i<=n;++i)
        {
            a[i]=read();
            ave+=a[i];
        }
        ave/=n;
        for(int i=1;i<=n;++i)
            sum[i]=sum[i-1]+a[i]-ave;
        sort(sum+1,sum+n+1);
        long long T=sum[n/2+1],ans=0;
        for(int i=1;i<=n;++i)
            ans+=abs(sum[i]-T);
        printf("%lld",ans);
        return 0;
    }

    设第ii个小朋友从他左边小朋友那里得到 lili 个糖果,向他右边的小朋友传递 riri 个糖果
    lili 与 riri 都可以为负数)
    显然 li=ri1li=ri−1 ,特殊地 l1=rnl1=rn
    pp为最终每个小朋友手中的糖果数
    则有 li+airi=pli+ai−ri=p , 即 ri=li+(aip)ri=li+(ai−p)
    而我们又有 li=ri1li=ri−1
    一直递归下去有 ri=l1+(a1p)+(a2p)+(a3p)++(aip)ri=l1+(a1−p)+(a2−p)+(a3−p)+…+(ai−p)
    最终答案为 |r1|+|r2|++|rn||r1|+|r2|+…+|rn|
    我们可以记下 aipai−p 的前缀和为 sumisumi
    那么 ans=|l1+sum1|+|l1+sum2|++|l1+sumn|

    设第ii个小朋友从他左边小朋友那里得到 lili 个糖果,向他右边的小朋友传递 riri 个糖果
    lili 与 riri 都可以为负数)
    显然 li=ri1li=ri−1 ,特殊地 l1=rnl1=rn
    pp为最终每个小朋友手中的糖果数
    则有 li+airi=pli+ai−ri=p , 即 ri=li+(aip)ri=li+(ai−p)
    而我们又有 li=ri1li=ri−1
    一直递归下去有 ri=l1+(a1p)+(a2p)+(a3p)++(aip)ri=l1+(a1−p)+(a2−p)+(a3−p)+…+(ai−p)
    最终答案为 |r1|+|r2|++|rn||r1|+|r2|+…+|rn|
    我们可以记下 aipai−p 的前缀和为 sumisumi
    那么 ans=|l1+sum1|+|l1+sum2|++|l1+sumn|ans=|l1+sum1|+|l1+sum2|+…+|l1+sumn|
    绝对值是个美妙的东西,|l1+sumi||l1+sumi| 可想为数轴上 li−li 与 sumisumi 的距离
    那么ansans的最小值在 l1−l1 取 sumisumi 中位数时取到

    求出sumisumi及其中位数后计算即可。

  • 相关阅读:
    keras_12_keras自带的Applications
    keras_11_keras中示例数据集
    keras_10_回调函数 Callbacks
    Runloop
    SDWebImage
    NSOperation
    单例模式
    GCD
    一文读懂汉明码
    聊聊SPOOLing技术
  • 原文地址:https://www.cnblogs.com/lovewhy/p/8969477.html
Copyright © 2011-2022 走看看