题解 洛谷 P4016 【负载平衡问题】

【题目】

题目描述

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

输入输出格式

输入格式:

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

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

输出格式:

输出最少搬运量。

输入输出样例

输入样例:

5
17 9 14 16 4

输出样例:

11

—————————————————————————————————————————————————

【思路】

首先,最终每个仓库的库存量可以计算出来,他等于仓库存储的货物总数除以总仓库数n。用M表示最终每个仓库的库存量。

假设有4个仓库,按顺序编号为1,2,3,4。假设1号给2号10个库存,然而2号又给1号20个库存,这实际上等价于2号给1号10个库存,而1号什么也没给2号。这样,可以设X2表示2号给1号多少个库存。如果X2<0,说明实际上是1号给了2号-X2个库存。X1,X2,X3,X4含义类似。由于是环形,X1指的是1号给了4号多少个库存。

先假设编号为i的仓库最初有Ai个库存。对于1号来说,它给了4号X1个库存,还剩A1-X1个库存;但因为2号给了他X2个库存,所以最终还剩下A1-X1+X2个库存。根据题意,该库存等于M。即我们得到了一个方程:A1-X1+X2=M。

同理,对于第2个仓库,有A2-X2+X3=M。最终我们可以得到n个方程,一共有n个变量。但因为可以从前n-1个方程推导出最好一个方程,只有n-1个方程是有用的,因而无法直接解方程组得到答案。

尽管如此,还是可以尝试用X1表示其它的Xi,那么这道题就变成了单变量的极值问题。

如果规定Ci=Ai-M,那么则有 对于第1个仓库,由A1-X1+X2=M可得X2=M-A1+X1=X1-C1 对于第2个仓库,由A2-X2+X3=M可得X3=M-A2+X2=X1-C2 对于第3个仓库,由A3-X3+X4=M可得X4=M-A3+X3=X1-C3 … 对于第n个仓库,由An-Xn+X1=M。这是一个多余的式子,并不能给我们更多的信息。

我们希望所有Xi的绝对值之和尽量小,即要最小。注意到|Xi-Ci|的几何意义是数轴上X1到C1的距离,所以问题变成了:给定数轴上的n个点,找到一个到它们的距离之和尽可能小的点。

而不难猜到,这个最优的X1就是这数的“中位数”(即排许后位于中间的数),因此只需要排个序就可以了。

让我们把数轴和上面的点画出来,如下图。在这里插入图片描述
任找一个点,如下图的黑点。它左边有4个输出点,右边有2个输出点。把它向左移动一点,不要移动太多,以免碰到了输出点。假设移动了d个单位,则黑点左边4个点到它的距离各减少了d,右边的2个点到它的距离则各自增加了d,但总的来说,距离之和减少了2d。

如果黑点左边有2个点,右边有4个点,道理类似,不过应该向右移动。换句话说,只有黑点左右两边的点不一样多,就不是最优解。什么情况下左右输入点不一样多呢?如果输入点为奇数个,则黑点必须和中间的点重合(中位数);如果输入点为偶数个,则黑点可以位于最中间的2个点的之间的任意位置(还是中位数)。

递推C数组,排序,再得到X1,最终得到ans=|X1|+|X1-C1|+|X1-C2|+…+|X1-Cn-1|。

—————————————————————————————————————————————————

【代码】

#include <bits/stdc++.h>
using namespace std;

const int MAXN=105;
int n,sum=0,m,x1,ans=0;
int a[MAXN],c[MAXN];

void readdata()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        sum+=a[i];
    }
}

void work()
{
    m=sum/n;
    c[0]=0;
    for(int i=1;i<n;i++) 
    c[i]=c[i-1]+a[i]-m;
    sort(c,c+n);
    x1=c[n/2];
    for(int i=0;i<n;i++) ans+=abs(x1-c[i]);
    printf("%d",ans);
}

int main()
{
    readdata();
    work();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44577381/article/details/86554743
今日推荐