洛谷 P4016 負載平衡問題

2022-05-10 05:56:55 字數 1134 閱讀 8581

第一眼看見覺得和均分紙牌差不多,然而因為這是環形的,並不能用均分紙牌的方法做,但是均分紙牌的思想仍然適用

首先我們假設平均數為sum1。

那麼對於第1個人,我們假設他給第n個人k個糖果,

第2個人給1

第3個人給2

第n個人給第n-1個人

那麼對於第1個人給完n,第2個人給完1,第乙個人不會再改變糖果數了

所以應該是sum1那麼第乙個人原來是a1

給n之後是a1-k,代價是k,

第2個人給1,使1的糖果數是sum1,所以應該給sum1-a1+k個,代價是 \(abs(sum1+k-a1)=abs(a1-k-sum1)\) ,那麼第2個人變成了 \(a2+a1-k-sum1\) 個

、第3個人需要給2個人 \(sum1-a2-a1+k+sum1=2*sum1-a1-a2+k\) 個,那麼代價是 \(abs(2*sum1-a1-a2+k)=abs(a1+a2-k-2*sum1)\)

以此類推第n個人給第n-1個人,代價應為 \(abs((a1+a2+……+an-1)-k-(n-1)*sum1)\),

那麼第乙個人給第n個人的代價k可以看成\(abs((a1+a2+……+an)-k-n*sum1)\),

所以我們設 \(b[i]=σ(a[j])-i*sum1 j<=i\) 那麼 4max=σ(b[i]-k)$

那麼b[i]是定值,和k無關,我們可以求出來,

就是求max的最小值了,

那麼k應該是b[i]陣列中的中位數,用數軸判斷

可以使max最小我們要找的就是sum的中位數,快排下就好了

#include #include #include using namespace std;

int n,tot,num[105];

int main()

tot/=n;

for(int i=1;i<=n;i++) num[i]+=num[i-1]-tot;

sort(num+1,num+1+n);

tot=n%2?num[n/2+1]:(num[n/2]+num[n/2+1])/2;

int ans=0;

for(int i=1;i<=n;i++) ans+=abs(num[i]-tot);

cout《最小費用最大流

轉換成供求平衡問題,待續...

洛谷P4016 負載平衡問題

問題描述 有乙個由n個沿環形鐵路分布的倉庫,每個倉庫有一定的貨物,某乙個倉庫可以往兩邊的倉庫運送貨物,求使n個倉庫貨物相等時的最小運輸量。怎麼做?這道題有很多做法,有貪心的,有二分的,有網路流的,其他的演算法相信同學們可以在其他的題解上看到,所以在這裡主要講一下網路流的做法。其實這是一道最小費用最大...

洛谷 P4016 負載平衡問題

題目描述 g 公司有 n 個沿鐵路運輸線環形排列的倉庫,每個倉庫儲存的貨物數量不等。如何用最少搬運量可以使 n 個倉庫的庫存數量相同。搬運貨物時,只能在相鄰的倉庫之間搬運。輸入輸出格式 輸入格式 檔案的第 1 行中有 1 個正整數 n,表示有 n 個倉庫。第 22 行中有 n 個正整數,表示 n 個...

洛谷P4016 負載平衡問題

g公司有 n個沿鐵路運輸線環形排列的倉庫,每個倉庫儲存的貨物數量不等。如何用最少搬運量可以使 n 個倉庫的庫存數量相同。搬運貨物時,只能在相鄰的倉庫之間搬運。輸入格式 檔案的第 1行中有 1個正整數 n,表示有 n 個倉庫。第 2行中有 n 個正整數,表示 n 個倉庫的庫存量。輸出格式 輸出最少搬運...