嘘~ 正在从服务器偷取页面 . . .

洛谷P4016 负载平衡问题 题解


洛谷P4016 负载平衡问题 题解

题目链接:P4016 负载平衡问题

题意

\(G\) 公司有 \(n\) 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等。如何用最少搬运量可以使 \(n\) 个仓库的库存数量相同。搬运货物时,只能在相邻的仓库之间搬运。

输入格式

第一行一个正整数 \(n\),表示有 \(n\) 个仓库。

第二行 \(n\) 个正整数,表示 \(n\) 个仓库的库存量。

输出格式

输出最少搬运量。

数据范围

\(1 \leq n \leq 100\)

贪心题写什么网络流。原题:P2512 糖果传递 或者 P2125 图书馆书架上的书

网上证明很多不写了,可以去看 mygr 巨佬写的文章

贴个 P2125 的代码:(这题要输出传递方案)

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
void up(int &x, int y) { x < y ? x = y : 0; }
void down(int &x, int y) { x > y ? x = y : 0; }
#define N ((int)(1e6 + 15))

int sum, mid, a[N], r[N], c[N];
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    // freopen("check.in","r",stdin);
    // freopen("check.out","w",stdout);
    int n; cin >> n;
    for(int i = 1; i <= n; i++) { cin >> a[i], sum += a[i]; }
    sum /= n; r[0] = c[0] = 0;
    for(int i = 1; i <= n; i++) r[i] = c[i] = c[i - 1] + a[i] - sum;
    sort(c + 1, c + 1 + n); mid = c[(n + 1) / 2]; int res = 0;
    for(int i = 1; i <= n; i++) res += abs(mid - c[i]);
    cout << res << '\n';
    for(int i = 1; i < n; i++)
        cout << mid - r[i - 1] << ' ' << -(mid - r[i]) << '\n';
    cout << mid - r[n - 1] << " " << -mid << '\n';
    return 0;
}

主要是这道题是 网络流24题 系列的,别到时候为了找着这题翻半天。


文章作者: q779
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 q779 !
评论
  目录