題解 洛谷P4016 網路流24題.03 【負載平衡問題】
阿新 • • 發佈:2020-08-16
\(\huge\mathbb{DESCRIPTION}\)
編號:洛谷\(P4016\)、\(LOJ6013\)(與洛谷上本題完全相同)
演算法:最小費用最大流\(\mathbb{OR}\)貪心
來源:網路流\(24\)題
\(\huge\mathbb{SOLUTION}\)
這道題目我們可以用最小費用最大流來解決。
但是,我覺得貪心也可以啊。
這明明就是均分紙牌...
考慮一下怎麼貪心。
首先,不難想到,我們要先求出平均數。
要想求平均數,就要求和。
易知:
\[Sum=\sum_{i=1}^N Array_i \]
\[Average=\frac{Sum}{N} \]
然後,我們不妨把\(Array_i\)
這樣\(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; }