文章目录

  • 题目描述
  • 题解:
  • 方法一:
    • 代码:
  • 方法二:

P4016 负载平衡问题

题目描述

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

输入格式

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

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

输出格式
输出最少搬运量。

输入输出样例
输入 #1复制

5
17 9 14 16 4

输出 #1复制

11

说明/提示
1≤n≤100。

题解:

和网络流啥关系。。。又是老婆饼里没老婆?

方法一:

环形均分纸牌问题,还是板子题,代码都是通用的。。

贪心+数论
这种题总感觉在哪见过。。。
我们先考虑一种弱化的题目
n个仓库排成一列,每个仓库都有一定数量货物a[i],只能相邻仓库可以传递货物,问最少需要传递几次才可以使各仓库货物相等?(就是把原题中的环改成一个列)
总数为sum,平均每个仓库分到T=sum/n,b[ i ]= T - a[ i ] ( b[]表示距离标准还有多少),只要b[i]>0就说明后面一定有b[x]<0,那当前i多余的货物就向后移动,其实也就是多退少补,最终移动总牌数
现在的问题是n个仓库围成一个圈,我们可以通过破圈成链来解决这个问题。环形均分纸牌问题可以发现一个性质:至少有两个仓库是不需要从彼此之间那得到卡牌,这样就可以从这两点破坏成链
如果这种方式不明白,可以看我的这个题解,有详细分析解答
博客讲解

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
const int maxn=1e6+4;
ll a[maxn];
int main()
{cin>>n;ll sum=0;for(int i=1;i<=n;i++){cin>>a[i];sum+=a[i];}sum/=n;for(int i=n;i>1;i--){a[i]=sum-a[i]+a[i+1];//为啥是这个公式可以在我那个推到里面得到 }a[1]=0;sort(a+1,a+n+1);ll res=0;int mid=(n+1)/2;for(int i=1;i<=n;i++){res+=abs(a[i]-a[mid]);} cout<<res<<endl;return 0;}

方法二:

恕我才疏学浅真的是一道最小费用最大流的题目
1.源点是0,汇点是n+1,费用是指两个相邻仓库中的运输单价
2.为了让所有仓库都均等,我们就要让多的仓库送出货物,连向源点;少的仓库就要接受货物,连向汇点。且连接源汇点的费用是0
3.相邻的仓库之间依次连上一条容量为 INF ,花费为 1 的双向边,
4.因为存在环的情况,所以还要特别处理1号节点与n号节点
我们用样例做一下分析:

每个边都有两种颜色数字,一个表示花费,一个表示容量
源点为起点的边容量之和等于以重点为边容量之和
跑一边费用流就可以了

#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = 5001;
const int MAXM = 50001;
const int INf = 2147483647;
int n, m, s, t, edge_sum = 1;
int maxflow, mincost;
int dis[MAXN], head[MAXN], incf[MAXN], pre[MAXN];
int a[MAXN];
bool vis[MAXN];
struct Edge {int next, to, dis, flow;
}edge[MAXM << 1];
inline void addedge(int from, int to, int flow, int dis) {edge[++edge_sum].next = head[from];edge[edge_sum].to = to;edge[edge_sum].dis = dis;edge[edge_sum].flow = flow;head[from] = edge_sum;
}
inline bool spfa() {queue <int> q;memset(dis, -1, sizeof(dis));memset(vis, 0, sizeof(vis));q.push(s);dis[s] = 0;//距离 vis[s] = 1;// 记录该点已询问过 incf[s] = 0x7fffffff;//记录路径上的最小流 while(!q.empty()) {int u = q.front();vis[u] = 0;q.pop();for(register int i = head[u]; i; i = edge[i].next) {if(!edge[i].flow) continue;int v = edge[i].to;if(dis[v] > dis[u] + edge[i].dis||dis[v]==-1) {dis[v] = dis[u] + edge[i].dis;incf[v] = min(incf[u], edge[i].flow);pre[v] = i;//记录前缀点 if(!vis[v]){vis[v] = 1;q.push(v);} }}}if(dis[t] == -1) return 0;return 1;
}
inline void EK() {while(spfa()) {int x = t;maxflow += incf[t];mincost += dis[t] * incf[t];int i;while(x != s) {i = pre[x];edge[i].flow -= incf[t];edge[i^1].flow += incf[t];//建立反向边 x = edge[i^1].to;}}
}
int main() {scanf("%d", &n);int sum = 0;for(register int i = 1; i <= n; ++i) {scanf("%d",&a[i]);sum += a[i];}sum /= n;//算出平均值for(register int i = 1; i <= n; ++i) {if(a[i] < sum) {//如果需要运入就与s连边addedge(0, i, sum - a[i], 0);addedge(i, 0, 0, 0);} else if(a[i] > sum) {//如果需要运出就与t连边addedge(i, n + 1, a[i] - sum, 0);addedge(n + 1, i, 0, 0);}//以上为与S,T相连,以下为与临点相连 if(i == 1) {//特判1,别忘了是无向图addedge(1, n, INf, 1);addedge(n, 1, 0, -1);addedge(n, 1, INf, 1);addedge(1, n, 0, -1);} else {addedge(i-1, i, INf, 1);addedge(i, i-1, 0, -1);addedge(i, i-1, INf, 1);addedge(i-1, i, 0, -1);}}s = 0, t = n + 1;EK();printf("%d\n",mincost);return 0;
}

P4016 负载平衡问题相关推荐

  1. 洛谷P4016 负载平衡问题

    洛谷P4016 负载平衡问题 题目大意: G 公司有 n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n 个仓库的库存数量相同.搬运货物时,只 能在相邻的仓库之间 ...

  2. P4016 负载平衡问题(最小费用最大流)

    P4016 负载平衡问题 题目描述 GG 公司有 nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬 ...

  3. 洛谷 - P4016 负载平衡问题(最小费用最大流)

    题目链接:点击查看 题目大意:有n个仓库分布在一个环形的区域,现在每个仓库可以与相邻的两个仓库转移货物,问最少需要操作多少次才能让每个仓库的货物都达到平衡 题目分析:达到平衡的意思其实就是都等于平均值 ...

  4. 洛谷 P4016 负载平衡问题 【最小费用最大流】

    求出平均数sum,对于大于sum的点连接(s,i,a[i]-sum,0),表示这个点可以流出多余的部分,对于小于sum的点连接(i,t,sum-a[i],0)表示这个点可以接受少的部分,然后每个点向相 ...

  5. LUOGU P4016 负载平衡问题

    题目描述 GG 公司有 nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入输出格式 输入格 ...

  6. windows网络负载平衡

    网络负载平衡的优点 1.网络负载平衡允许你将传入的请求传播到多台服务器上,即可以使用多台服务器共同分担对外的网络请求服务.网络负载平衡技术保证即使是在负载很重的情况下它们也能作出快速响应. 2.网络负 ...

  7. [译]NGINX 和 ZooKeeper,动态负载平衡和部署(上)

    [译]NGINX 和 ZooKeeper,动态负载平衡和部署(上) Aidan Carson · 2016-07-22 11:38 原文:NGINX and ZooKeeper, Dynamic Lo ...

  8. (译)如何用命令行在windows Azure上安装负载平衡的web Farm虚拟机(linux或其他)...

    我一哥们考虑把他的一些基于linux的网站移到Azure上.如果你现在的网站是node.js, ASP,ASP.NET,或PHP做的,使用Azure web站点是最容易的.我会在这篇文章里向你展示如何 ...

  9. 巧用Win2003负载平衡服务实现LCS2005企业版的部署:LCS2005系列之五

    巧用Win2003负载平衡解决LCS2005企业版部署 在前面的博文中我们介绍了一些LCS2005标准版的部署和使用,今天我们来实现LCS2005企业版的部署.LCS企业版比标准版复杂得多,由于LCS ...

最新文章

  1. 采集Nginx日志的几种方式
  2. 做事情一定要从小事情着手
  3. grid布局浏览器兼容_CSS Grid布局尝试
  4. output怎么用_性能领先,即训即用,快速部署,飞桨首次揭秘服务器端推理库
  5. T-SQL 操作文件 具体解释
  6. 我的docker随笔33:在容器中连接oracle数据库
  7. BP神经网络基础知识(前向传播和后向传播)
  8. C++编程语言的应用方向有哪些?
  9. [深度学习]什么叫激活函数
  10. [论文阅读] Person Re-identification: Past, Present and Future
  11. Linux -- Reactor
  12. 程序员常去的14个顶级开发社区
  13. FTP超详解及搭建步骤
  14. 图的遍历 (深度优先遍历和广度优先遍历)
  15. 联合国可持续发展目标,中国大数据服务支持
  16. PPT的默认设置以及快捷键的使用(超级实用的PPT操作)
  17. 梦雨百度网盘机器人好友群组消息自动回复软件(可用于自动发货场景)
  18. Flash&Flex大全
  19. 操作系统 --cpu与指令集
  20. java从小白到老白⑤——传智播客27版笔记

热门文章

  1. 一堂儿童科学实验课引起的思考:数学和化学有什么关系?
  2. 如何使用TensorFlow玩转深度学习?
  3. 北大教授郑也夫斗胆谈了7个天大的问题(非常狠,也很现实)
  4. android listview添加数据_Android面经分享,失业两个月,五一节前拿到offer
  5. mysql快照过久_Oracle 快照(snapshot) 管理
  6. linux仿真速度快吗,Linux上安装使用最快的GPU加速的终端仿真器Alacritty
  7. mysql外键约束创建及删除_MySQL中的外键的创建,约束和删除
  8. jsp需要多少java基础_Java基础——JSP(一)
  9. leetcode669. 修剪二叉搜索树
  10. 一文了解贪心算法和回溯算法在前端中的应用