題目描述
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 個倉庫的庫存量。輸出格式 輸出最少搬運...