1. 程式人生 > 實用技巧 >題解 洛谷P4016 網路流24題.03 【負載平衡問題】

題解 洛谷P4016 網路流24題.03 【負載平衡問題】

\(\huge\mathbb{DESCRIPTION}\)
編號:洛谷\(P4016\)\(LOJ6013\)(與洛谷上本題完全相同)
演算法:最小費用最大流\(\mathbb{OR}\)貪心
來源:網路流\(24\)
\(\huge\mathbb{SOLUTION}\)
這道題目我們可以用最小費用最大流來解決。
但是,我覺得貪心也可以啊。
這明明就是均分紙牌...
考慮一下怎麼貪心。
首先,不難想到,我們要先求出平均數。
要想求平均數,就要求和。
易知:

\[Sum=\sum_{i=1}^N Array_i \]

\[Average=\frac{Sum}{N} \]

然後,我們不妨把\(Array_i\)

減去\(Sum\)
這樣\(Array_i\)就變成了與目標的差。
最後,我們按開始的序列順序,像普通均分紙牌一樣處理出字首和\(Prefix\)陣列,那麼假設列舉的位置為\(x\),則類比普通均分紙牌求法,新的\(Prefix_i=Prefix_i-Prefix_x\),於是:

\[Answer=\sum{|Prefix_i-Prefix_x|} \]

易證\(Prefix_x\)\(Prefix\)陣列的中位數時,\(Ans\)最小。
於是就解決了。
\(\huge\mathbb{CODE}\)

#include<bits/stdc++.h>
using namespace std;
int N;
long long Array[101],Prefix[101];
int main(void)
{
	register int i;
	cin>>N;
	for(i=1;i<=N;i++)
	{
		cin>>Array[i];
	}
	register long long Sum;
	Sum=0;
	for(i=1;i<=N;i++)
	{
		Sum+=Array[i];
	}
	Sum/=N;
	for(i=1;i<=N;i++)
	{
		Array[i]-=Sum;
		Prefix[i]=Prefix[i-1]+Array[i];
	}
	sort(Prefix+1,Prefix+N+1);
	Sum=0;
	for(i=1;i<=N;i++)
	{
		Sum+=abs(Prefix[N/2+1]-Prefix[i]);
	}
	cout<<Sum<<endl;
	return 0;
}