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;
}

拜了个拜

posted @ 2021-08-24 10:36  hewt  阅读(20)  评论(0编辑  收藏  举报