G 公司有 n nn 個沿鐵路運輸線環形排列的倉庫,每一個倉庫存儲的貨物數量不等。如何用最少搬運量能夠使 n nn 個倉庫的庫存數量相同。搬運貨物時,只能在相鄰的倉庫之間搬運。html
文件的第 1 11 行中有 1 11 個正整數 n nn,表示有 n nn 個倉庫。
第 2 22 行中有 n nn 個正整數,表示 n nn 個倉庫的庫存量。ios
輸出最少搬運量。網絡
5 17 9 14 16 4
11
1≤n≤100 1 \leq n \leq 1001≤n≤100ui
思路:首先求出平均數,由於物資流動的最終結果是每一個倉庫的貨物數目相同,就是每一個倉庫貨物數目達到平均數。spa
而後環形倉庫能夠向兩邊搬運,因此固定一個方向,就是a[i] - >a[i+1]吧,並記錄搬運數量爲c[i]。因此c[i]就表示貨物由第i個倉庫搬到第i+1倉庫的數量,負數表示i+1倉庫往第i個倉庫搬貨。而後根據a[i]+c[i]-c[i-1]==m,能夠求出每一個倉庫的貨物搬動數量。code
接下來就是處理搬運貨物的總量最小,就是∑|c[i]| (i=0…n-1)最小。拿回原題意語境中咱們能夠知道c[i] (i=0,1,2…n-1)是相互影響的,可是它們的相對大小不會改變,因此咱們如今能夠把問題轉化爲一個數學題,就是把c[i]固定在一個數軸上,而後肯定一個原點,保證絕對值之和最小便可。htm
而後就能夠發現將原點固定在c[0]-c[n]最中間的位置(物理位置中間,就是原點左右兩邊數目儘量相同)時絕對值之和時最小的。由於c[i] (i=0,1,2…)是相互影響的,又因相對大小不會改變,因此咱們能夠把c[0]隨便賦一個值,而後就能夠把c[i]的相對值都求出來了。blog
#include<iostream> #include<cstdio> #include<algorithm> #define maxn 110 using namespace std; int a[maxn],c[maxn],n,m; int main(){ long long sum=0; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); sum+=a[i]; } m=sum/n; c[0]=0; for(int i=2;i<=n;i++)c[i]=c[i-1]+a[i]-m; sort(c+1,c+n+1); int mn=0; for(int i=1,j=n;i<j;i++,j--)mn+=c[j]-c[i]; printf("%d",mn); return 0; }