洛谷 P4016 負載平衡問題

2021-09-10 01:15:31 字數 1861 閱讀 9766

題目描述

g 公司有 n 個沿鐵路運輸線環形排列的倉庫,每個倉庫儲存的貨物數量不等。如何用最少搬運量可以使 n 個倉庫的庫存數量相同。搬運貨物時,只能在相鄰的倉庫之間搬運。

輸入輸出格式

輸入格式:

檔案的第 1 行中有 1 個正整數 n,表示有 n 個倉庫。

第 22 行中有 n 個正整數,表示 n 個倉庫的庫存量。

輸出格式:

輸出最少搬運量。

輸入輸出樣例

輸入樣例:

517 9 14 16 4

輸出樣例:

思路首先,最終每個倉庫的庫存量可以計算出來,他等於倉庫儲存的貨物總數除以總倉庫數n。用m表示最終每個倉庫的庫存量。

假設有4個倉庫,按順序編號為1,2,3,4。假設1號給2號10個庫存,然而2號又給1號20個庫存,這實際上等價於2號給1號10個庫存,而1號什麼也沒給2號。這樣,可以設x2表示2號給1號多少個庫存。如果x2<0,說明實際上是1號給了2號-x2個庫存。x1,x2,x3,x4含義類似。由於是環形,x1指的是1號給了4號多少個庫存。

先假設編號為i的倉庫最初有ai個庫存。對於1號來說,它給了4號x1個庫存,還剩a1-x1個庫存;但因為2號給了他x2個庫存,所以最終還剩下a1-x1+x2個庫存。根據題意,該庫存等於m。即我們得到了乙個方程:a1-x1+x2=m。

同理,對於第2個倉庫,有a2-x2+x3=m。最終我們可以得到n個方程,一共有n個變數。但因為可以從前n-1個方程推導出最好乙個方程,只有n-1個方程是有用的,因而無法直接解方程組得到答案。

儘管如此,還是可以嘗試用x1表示其它的xi,那麼這道題就變成了單變數的極值問題。

如果規定ci=ai-m,那麼則有 對於第1個倉庫,由a1-x1+x2=m可得x2=m-a1+x1=x1-c1 對於第2個倉庫,由a2-x2+x3=m可得x3=m-a2+x2=x1-c2 對於第3個倉庫,由a3-x3+x4=m可得x4=m-a3+x3=x1-c3 … 對於第n個倉庫,由an-xn+x1=m。這是乙個多餘的式子,並不能給我們更多的資訊。

我們希望所有xi的絕對值之和盡量小,即要最小。注意到|xi-ci|的幾何意義是數軸上x1到c1的距離,所以問題變成了:給定數軸上的n個點,找到乙個到它們的距離之和盡可能小的點。

而不難猜到,這個最優的x1就是這數的「中位數」(即排許後位於中間的數),因此只需要排個序就可以了。

讓我們把數軸和上面的點畫出來,如下圖。

任找乙個點,如下圖的黑點。它左邊有4個輸出點,右邊有2個輸出點。把它向左移動一點,不要移動太多,以免碰到了輸出點。假設移動了d個單位,則黑點左邊4個點到它的距離各減少了d,右邊的2個點到它的距離則各自增加了d,但總的來說,距離之和減少了2d。

如果黑點左邊有2個點,右邊有4個點,道理類似,不過應該向右移動。換句話說,只有黑點左右兩邊的點不一樣多,就不是最優解。什麼情況下左右輸入點不一樣多呢?如果輸入點為奇數個,則黑點必須和中間的點重合(中位數);如果輸入點為偶數個,則黑點可以位於最中間的2個點的之間的任意位置(還是中位數)。

遞推c陣列,排序,再得到x1,最終得到ans=|x1|+|x1-c1|+|x1-c2|+…+|x1-cn-1|。

**如下:

#include

using

namespace std;

const

int maxn=

105;

int n,sum=

0,m,x1,ans=0;

int a[maxn]

,c[maxn]

;void

readdata()

}void

work()

intmain()

洛谷P4016 負載平衡問題

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

洛谷 P4016 負載平衡問題

第一眼看見覺得和均分紙牌差不多,然而因為這是環形的,並不能用均分紙牌的方法做,但是均分紙牌的思想仍然適用 首先我們假設平均數為sum1。那麼對於第1個人,我們假設他給第n個人k個糖果,第2個人給1 第3個人給2 第n個人給第n 1個人 那麼對於第1個人給完n,第2個人給完1,第乙個人不會再改變糖果數...

洛谷P4016 負載平衡問題

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