P4016 负载平衡问题
题目描述
\(G\) 公司有 \(n\) 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等。如何用最少搬运量可以使 \(n\) 个仓库的库存数量相同。搬运货物时,只能在相邻的仓库之间搬运。
输入输出
输入格式
第一行一个正整数 \(n\),表示有 \(n\) 个仓库。
第二行 \(n\) 个正整数,表示 \(n\) 个仓库的库存量。
输出格式
输出最少搬运量。
输入样例
5
17 9 14 16 4
输出样例
11
说明
\(1 \leq n \leq 100\)
Sol
这玩意出自“网络流24题”?可是。。。好像是贪心啊。
这题的难点主要是列方程:\(\overline{x}_a\)表示平均数,读作x bá,
\(\overline{x}_a=\dfrac{a_1+a_2+......+a_n}{n}\)
\(m_{0.5}(a_1,a_2,......,a_n)\)表示一组数据的中位数。文中取\(a_{n/2+1}\)
设\(K_1,K_2,......,K_n\)表示第\(1,2,......,n\)个人给他左边的人的货物数。
( \(K_1\)表示第一个人给第\(N\)个人的货物数,是个未知数。 )
\(A_1,A_2,......,A_n\)表示每人现有的货物数。
不难推出
\(A_1-K_1+K_2=\overline{x}_A\)
再推出
\(K_2=\overline{x}_A+K_1-A_1\)
同理可得:
\(K_3=\overline{x}_A+K_2-A_2\)
\(\begin{cases}K_2=\overline{x}_A+K_1-A_1\\K_3=\overline{x}_A+K_2-A_2\\...\\K_n=\overline{x}_A+K_{n-1}-A_n\end{cases}\)
这是一个\(n\)元\(1\)次方程,怎么解?
暴力! 当然是用代入法消元啊
以\(K_3\)为例,\(K_3=2\overline{x}_A+K_1-A_1-A_2\)
我们设\(X_i=-i\overline{x}_A+\sum\limits_{j=1}^{i-1}{A_j}\)
\(X_2=A_1+A_2-2\overline{x}_A\)
\(X_3=A_1+A_2+A_3-3\overline{x}_A\)
做差,得:
\(X_3=X_2-\overline{x}_A+A_3\)
观察这个式子,我们可以发现一个一般规律:
\(X_i=X_{i-1}-\overline{x}_A+A_i\)- - - - - - ①
然后
\(K_n=K_1-X_{n-1}\)
已知:\(ans=\sum\limits_{i=1}^{n}{|K_i|}\)
故:\(ans=|K_1-0|+|K_1-X_1|+......+|K_1-X_{n-1}|\)
∴\(min \{ans\}=min\{|K_1-0|+|K_1-X_1|+......+|K_1-X_{n-1}|\}\)
几何意义:在数轴上选择一个\(K_1\),使之到\(0,X_1,X_2,......,X_{n-1}\)的距离之和最小
这个\(K_1\)我们要给它赋一个最优值
这个值就是\(m_{0.5}\{0,X_1,X_2,......,X_{n-1}\}\)。
就是普通的设公交车站的问题
\(min \{ans\}=|m-0|+|m-X_1|+......+|m-X_{n-1}|\)- - - - - - ②
所以在程序中实现 ①②即可AC!!!
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int a[maxn],x[maxn];
int n;
int main()
{
scanf("%d",&n);
int num=0;
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
num+=a[i];
}
num/=n;
for(int i=1;i<=n;i++) {
x[i]=x[i-1]-a[i]+num;
}
sort(x+1,x+1+n);
int m=x[n/2+1],ans=0;
for(int i=1;i<=n;i++) {
ans+=abs(x[i]-m);
}
cout<<ans<<endl;
}
拜了个拜