loj #6013. 「網絡流 24 題」負載平衡

#6013. 「網絡流 24 題」負載平衡

題目描述

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 1001n100ui

思路:首先求出平均數,由於物資流動的最終結果是每一個倉庫的貨物數目相同,就是每一個倉庫貨物數目達到平均數。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;
}
相關文章
相關標籤/搜索