題目描述
gg 公司有 nn 個沿鐵路運輸線環形排列的倉庫,每個倉庫儲存的貨物數量不等。如何用最少搬運量可以使 nn 個倉庫的庫存數量相同。搬運貨物時,只能在相鄰的倉庫之間搬運。
輸入輸出格式
輸入格式:
檔案的第 11 行中有 11 個正整數 nn ,表示有 nn 個倉庫。
第 22 行中有 nn 個正整數,表示 nn 個倉庫的庫存量。
輸出格式:
輸出最少搬運量。
輸入輸出樣例
輸入樣例#1:
5 17 9 14 16 4
輸出樣例#1:
11 說明
1 \leq n \leq 1001≤n≤100
第一種方法就是環形均分紙牌,和糖果傳遞一模一樣。
第二種方法是網路流,建立超級源點s,s向比平均值大的連一條容量為a[i]-平均值,花費為0的邊,建立超級源點t,比平均值小的點向t連一條容量為平均值-a[i],花費為0的邊,然後每個點向它左右連一條容量為inf,花費為1的邊,然後跑費用流即可。
#include
#include
#include
#include
using
namespace
std;
const
int maxn = 10005;
const
int inf = 0x3f3f3f3f;
inline
int rd()
while(isdigit(ch))
return f?x:-x;
}int n,a[maxn],sum,head[maxn],cnt=1,s,t;
int to[maxn<<1],nxt[maxn<<1],val[maxn<<1],cost[maxn<<1];
int incf[maxn],pre[maxn],dis[maxn],ans;
bool vis[maxn];
queue
q;inline
void add(int bg,int ed,int w,int c)
bool spfa()
}vis[x]=0;
}if(dis[t]==inf) return
false;
return
true;
}void update()
ans+=dis[t]*incf[t];
}int main()
for(register
int i=2;i1,inf,1),add(i,i+1,inf,1);
add(1,2,inf,1),add(1,n,inf,1);
add(n,n-1,inf,1),add(n,1,inf,1);
while(spfa()) update();cout
0;}
luogu P4016 負載平衡問題
本題有數學貪心解法和費用流解法 數學解法就看看luogu題解吧,窩太菜了 費用流就找建圖法,依舊是設超級源點和匯點,初始資料就源點s向該點連點,流量就是初始量,代價為0,然後每個倉庫向相鄰的點連邊,容量無限大,代價為1,再每個倉庫向匯點連點,容量就是sum n,代價為0,直接跑最大流最小費就行了,這...
LuoguP4016 負載平衡問題 費用流
g 公司有 n個沿鐵路運輸線環形排列的倉庫,每個倉庫儲存的貨物數量不等。如何用最少搬運量可以使 n個倉庫的庫存數量相同。搬運貨物時,只能在相鄰的倉庫之間搬運。輸入格式 檔案的第 11 行中有 11 個正整數 n,表示有 n個倉庫。第 22 行中有 n個正整數,表示 n個倉庫的庫存量。輸出格式 輸出最...
P4016 負載平衡問題
方法二 p4016 負載平衡問題 g 公司有 n 個沿鐵路運輸線環形排列的倉庫,每個倉庫儲存的貨物數量不等。如何用最少搬運量可以使 n 個倉庫的庫存數量相同。搬運貨物時,只能在相鄰的倉庫之間搬運。輸入格式 第一行乙個正整數 n,表示有 n 個倉庫。第二行 n 個正整數,表示 n 個倉庫的庫存量。輸出...