第一眼看見覺得和均分紙牌差不多,然而因為這是環形的,並不能用均分紙牌的方法做,但是均分紙牌的思想仍然適用
首先我們假設平均數為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 個倉庫的庫存量。輸出格式 輸出最少搬運...