P4016 负载平衡问题

文章目录

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

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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319932.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ocelot简易教程(二)之快速开始2

为什么这篇的标题叫“Ocelot简易教程&#xff08;二&#xff09;之快速开始2”呢&#xff0c;因为很多朋友跟我说上一篇“ Ocelot简易教程&#xff08;二&#xff09;之快速开始1”内容太少了&#xff0c;只是简单介绍Ocelot的一些简单配置&#xff0c;让Ocelot能跑起来&#x…

.NET的前世今生与将来

笔者注谨以此文纪念我敬重的2016年9月17日去世的 装配脑袋 逝世两周年让大家久等了&#xff0c;前后花了1年的时间&#xff0c;几经改版&#xff0c;终于完成撰写了一万字长文&#xff0c;回顾和展望.NET这16年来的成功与失败。最终能成文是因为我给自己承诺必须赶在 装配脑袋 …

P4011 孤岛营救问题

P4011 孤岛营救问题 文章目录输入输出样例题意&#xff1a;题解&#xff1a;代码&#xff1a;输入输出样例 输入 4 4 9 9 1 2 1 3 2 1 2 2 2 0 2 1 2 2 0 2 1 3 1 0 2 3 3 3 0 2 4 3 4 1 3 2 3 3 0 3 3 4 3 0 4 3 4 4 0 2 2 1 2 4 2 1输出 14题意&#xff1a; (原题太长我就…

[NOI2014] 起床困难综合症(二进制,贪心)

#include<bits/stdc.h> int n,m,ans,x,a10,a2-1; //-1的补码:11111111111... char str[5]; int main(){scanf("%d%d",&n,&m);while(n--){scanf("%s%d",str,&x);if(str[0]A) a1&x, a2&x;if(str[0]X) a1^x, a2^x;if(str[0]O) a1|…

P4015 运输问题

P4015 运输问题 文章目录题目描述&#xff1a;输入格式&#xff1a;输出格式&#xff1a;输入输出样例&#xff1a;题解&#xff1a;代码&#xff1a;题目描述&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 两行分别输出最小运输费用和最大运输费用。 输入输出样例…

NetCore使用Jwtbearer给WebAPI添加访问控制

现在JWT代替session来做访问控制已经成为大部分webapi的做法&#xff0c;今天我们也来尝试一下WebAPI使用NetCore2.1创建,无身份认证信息nuget安装包IdentityModel 选择稳定版3.9.0Microsoft.AspNetCore.Authorization 版本2.1.1Microsoft.AspNetCore.Authentication.JwtBearer…

图论复习——网络流

最大流 与 最小费用最大流 Blog 有上下界网络流 Blog 最小割 Blog 模拟费用流 CF724E Goods transportation 摘自此Blog 建图优化 若同一行或者同一列的点互相可达&#xff0c;那么其实不需要两两连边&#xff0c;只需要对于每行和每列建一个辅助节点作为中转 [ARC…

离散大创项目——图片识别笔记

1.我才知道ainput()读入的竟然是字符串。。。还要强制转化成int型&#xff0c;这玩意搞了我好久 2.对照片进行裁剪&#xff0c;将照片周围多余的白色部分去除&#xff08;也就是让图像尽可能撑满整个框&#xff09; 由上一张裁成下一张 from PIL import Image import os SCA…

最小割小记

参考博客&#xff1a;最小割浅谈 关于最小割 常用描述 表述一&#xff1a;删去若干条边使得源点到汇点不连通&#xff0c;求删边的权值和的最小可能值。 表述二&#xff1a;将点集分为(S,T)(S,T)(S,T)&#xff0c;记所有从SSS中出发到TTT中的边的权值和为c(S,T)c(S,T)c(S,T)&a…

斐波那契数列求法

文章目录求斐波那切数列的几个方法&#xff1a;经典做法&#xff1a;递推&#xff1a;动态规划矩阵快速幂原理&#xff1a;代码&#xff1a;例题&#xff1a;模拟过程求斐波那切数列的几个方法&#xff1a; 经典做法&#xff1a; 众所周知&#xff1a;斐波那契数列的定义是f(…

ASP.Net Core2.1中的HttpClientFactory系列一

引言&#xff1a;ASP.NET Core2.1 中出现了一个新的 HttpClientFactory 功能, 它有助于解决开发人员在使用 HttpClient 实例从其应用程序中访问外部 web 资源时可能遇到的一些常见问题。关于HttpClientFactory 到底解决了那些HttpClient的严重问题&#xff0c;下面是我罗列出来…

最大子矩阵(普通和01)

文章目录普通矩阵&#xff08;单个矩阵值为任何数&#xff09;最大子段和扩展到二维情况01矩阵&#xff08;单个矩阵值为0或1&#xff09;代码&#xff1a;普通矩阵&#xff08;单个矩阵值为任何数&#xff09; 例题&#xff1a;POJ 1074 求出其中最大的子矩阵 答案是&#x…

自动化流程开源框架BotSharp

BotSharp是一款为方便构建智能对话机器人平台而开发的开源框架&#xff0c;最大的特点是所有模型算法都是基于.NET Core开发实现&#xff0c;甚至最基本的Penn Treebank分词标准&#xff0c;都重新用C#实现了。在机器学习python占绝对优势的时代算是不可多得的项目。该项目涉及…

积极参与开源项目,促进.NET Core生态社区发展

今天早上在微信群里聊天聊到百度的SDK 已经支持.NET Core, 百度已经在3月份就支持了&#xff0c;想起当时还是我在他们的github上提的issue&#xff1a; https://github.com/Baidu-AIP/dotnet-sdk/issues/3。.NET Core生态社区的发展已经四年多时间&#xff0c;日趋完善&#x…

Service Fabric 与Ocelot 的集成

概要云应用程序通常都需要使用前端网关&#xff0c;为用户、设备或其他应用程序提供同一个入口点。 在 Service Fabric 中&#xff0c;网关可以是任意无状态服务&#xff08;如 ASP.NET Core 应用程序&#xff09; 。本文介绍了如何将Ocelot用作 Service Fabric 应用程序的网关…

图论复习——最短路

知识点 最短路径算法 最短路径树 每个点uuu的父亲为使uuu得到最短距离的前驱节点&#xff0c;若有多个&#xff0c;则取任意一个。 题目 CF449B Jzzhu and Cities Blog CF464E The Classic Problem Blog [XSY3888] 传送门 对每个点uuu&#xff0c;记d(u)d(u)d(u)表示uuu…

T-Dongle-S3开发笔记——创建工程

创建Hello world工程 打开命令面板 方法1&#xff1a;查看->命令面板 方法2&#xff1a;按F1 选择ESP-IDF:展示示例项目 创建helloworld 选择串口 选择芯片 至此可以编译下载运行了 运行后打印的信息显示flash只有2M。但是板子上电flash是W25Q32 4MB的吗 16M-bit

hdu 1576 A/B

文章目录题目&#xff1a;题解&#xff1a;代码&#xff1a;hdu 1576题目&#xff1a; 要求(A/B)%9973&#xff0c;但由于A很大&#xff0c;我们只给出n(nA%9973)(我们给定的A必能被B整除&#xff0c;且gcd(B,9973) 1)。 Input 数据的第一行是一个T&#xff0c;表示有T组数据。…

ASP.NET Core 中断请求了解一下(翻译)

本文所讲方式仅适用于托管在Kestrel Server中的应用。如果托管在IIS和IIS Express上时&#xff0c;ASP.NET Core Module(ANCM)并不会告诉ASP.NET Core在客户端断开连接时中止请求。但可喜的是&#xff0c;ANCM预计在.NET Core 2.2中会完善这一机制。1. 引言假设有一个耗时的Act…

.net core实践系列之短信服务-架构优化

前言通过前面的几篇文章&#xff0c;讲解了一个短信服务的架构设计与实现。然而初始方案并非100%完美的&#xff0c;我们仍可以对该架构做一些优化与调整。同时我也希望通过这篇文章与大家分享一下&#xff0c;我的架构设计理念。源码地址&#xff1a;https://github.com/SkyCh…