NC202492 仓库选址

题目

题目描述

牛能在某小城有了固定的需求,为了节省送货的费用,他决定在小城里建一个仓库,但是他不知道选在哪里,可以使得花费最小。

给出一个 \(m \times n\) 的矩阵,代表下一年小城里各个位置对货物的需求次数。我们定义花费为货车载货运输的距离,货车只能沿着水平或竖直方向行驶。

输入描述

首先在一行中输入\(T, T \le 10\),代表测试数据的组数。

每组输入在第一行给出两个正整数 \(n,m , 1 \le n,m \le 100\) ,分别代表矩阵的宽和高。

接下来 \(m\) 行,每行 \(n\) 个不超过 \(1000\) 的数字,代表矩阵里的元素。

输出描述

每组输入在一行中输出答案。

示例1

输入

3
2 2
1 1
1 0
4 4
0 8 2 0
1 4 5 0
0 1 0 1
3 9 2 0
6 7
0 0 0 0 0 0
0 1 0 3 0 1
2 9 1 2 1 2
8 7 1 3 4 3
1 0 2 2 7 7
0 1 0 0 1 0
0 0 0 0 0 0

输出

2
55
162

备注

送货时只能单次运输,若该位置需要 \(3\) 次,货车必须跑 \(3\) 次。

即使该位置需要被送货,我们仍然可以选择该位置作为仓库。

题解

思路

知识点:二维前缀和+思维。

因为送货按曼哈顿距离(垂直水平的距离)计算费用,故考虑可以将行 \(x\) 和列 \(y\) 坐标分开确定。

设费用 \(P_x\) 代表以 \(x\) 为行的选址在x方向上消耗的费用,\(a[i][j]\) 为某仓库需求次数,\(s[i][j]\) 为 \([1,1] \times [i,j]\)区域需求总数。

考虑递推式 \(P_{x+1} - P_x = \sum_{i=1}^x \sum_{j=1}^n a[i][j] - \sum_{i=x+1}^m \sum_{j=1}^n a[i][j] = s[x][n] - (s[m][n] - s[x][n]) = 2 \cdot s[x][n] - s[m][n]\)

可以看出\(x \rightarrow x+1\) 后的费用增量取决于 \(s[x][n]\) 与 总量 \(s[m][n]\) 的关系。为了使 \(P_x\) 最小化,尝试从 \(x=1\) 开始找到第一个使 \(P_{x+1} - P_x\) 为正 \(x\) 。即 \(2 \cdot s[x][n] \geq s[m][n]\) 或者 $ s[x][n] > \lfloor \frac{s[m][n]}{2} \rfloor$,所以只要找到刚好过半的某个 \(x\) 即可(注意后者是整除不能等于)。

同理找到 \(y\) 后,以 \((x,y)\) 为选址对全体仓库计算费用即可。

时间复杂度 \(O(mn)\)

空间复杂度 \(O(mn)\)

代码

#include <bits/stdc++.h>

using namespace std;

int a[107][107],s[107][107];

int main()
{
std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T;
cin>>T;
while(T--)///多组数据要么初始化再加等于,要么输入覆盖再加等于,否则要用等于赋值
{
int n,m;
cin>>n>>m;
for(int i = 1; i<=m; i++)
{
for(int j = 1; j<=n; j++)
{
cin>>a[i][j];
s[i][j] = a[i][j] + s[i][j-1] + s[i-1][j] - s[i-1][j-1];
}
}
int x,y;
for(int i = 1; i<=m; i++)
{
if(s[i][n]>s[m][n]/2)
{
x = i;
break;
}
}
for(int j = 1; j<=n; j++)
{
if(s[m][j]>s[m][n]/2)
{
y = j;
break;
}
}
int ans = 0;
for(int i = 1; i<=m; i++)
{
for(int j = 1; j<=n; j++)
{
ans+=a[i][j]*(abs(i-x)+abs(j-y));
}
}
cout<<ans<<'\n';
}
return 0;
}

NC202492 仓库选址的更多相关文章

  1. 小奇的仓库(树形DP)

    「题目背景」 小奇采的矿实在太多了,它准备在喵星系建个矿石仓库.令它无语的是,喵星系的货运飞船引擎还停留在上元时代! 「问题描述」 喵星系有n个星球,星球以及星球间的航线形成一棵树. 从星球a到星球b ...

  2. [CSP-S模拟测试]:小奇的仓库(warehouse)(树形DP)

    题目背景 小奇采的矿实在太多了,它准备在喵星系建个矿石仓库.令它无语的是,喵星系的货运飞船引擎还停留在上元时代! 题目描述 喵星系有$n$个星球,星球以及星球间的航线形成一棵树.从星球$a$到星球$b ...

  3. 【换根DP】小奇的仓库

    题目背景 小奇采的矿实在太多了,它准备在喵星系建个矿石仓库.令它无语的是,喵星系的货运飞船引擎还停留在上元时代! 题目内容 喵星系有\(n\)个星球,星球以及星球间的航线形成一棵树. 从星球\(a\) ...

  4. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  5. 机器学习是万能的吗?AI落地有哪些先决条件?

    机器学习是万能的吗?AI落地有哪些先决条件? https://mp.weixin.qq.com/s/9rNY2YA3BMpoY8NQ_rVIjQ 1.引言 入门机器学习或从事其相关工作前,不知道你思考 ...

  6. 2019.10.16&17小结

    话说也蛮久没写小结了,主要这两次考试失分严重,还是总结下吧. 10.16 T1 小奇挖矿2 100/0 [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿石交易市 ...

  7. FJOI2020 游记

    Day -1 啥都不会,药丸 看了看统考题,好难,爆零的节奏 文化课OI双爆炸 尽力吧 Day 0 花三个多小时才到考场 福州真的好热 签到 在小礼堂待了一会,顺便给手机充了电 四点试机,今年用了新系 ...

  8. idea为本地项目创建仓库并git到云上

    1.为本地项目创建一个本地仓库: 2.在码云上创建一个仓库,(初始化的时候先不要创建README.md文件) 3.本地仓库关联远程仓库:右键项目选址git>>repository>& ...

  9. Python小白的数学建模课-07 选址问题

    选址问题是要选择设施位置使目标达到最优,是数模竞赛中的常见题型. 小白不一定要掌握所有的选址问题,但要能判断是哪一类问题,用哪个模型. 进一步学习 PuLP工具包中处理复杂问题的字典格式快捷建模方法. ...

随机推荐

  1. Envoy熔断限流实践(一)基于Rainbond插件实现熔断

    Envoy 可以作为 Sevice Mesh 微服务框架中的代理实现方案,Rainbond 内置的微服务框架同样基于 Envoy 实现.本文所描述的熔断实践基于 Rainbond 特有的插件机制实现. ...

  2. 【架构视角】一篇文章带你彻底吃透Spring

    框架的意义 对于程序员来说,我们通常知道很多概念,例如组件.模块.系统.框架.架构等,而本文我们重点说 框架. 框架,本质上是一些实用经验集合.即是前辈们在实际开发过程中积攒下来的实战经验,累积成一套 ...

  3. 团队Arpha2

    队名:观光队 组长博客 作业博客 组员实践情况 王耀鑫 **过去两天完成了哪些任务 ** 文字/口头描述 完成服务器连接数据库部分代码 展示GitHub当日代码/文档签入记录 接下来的计划 服务器网络 ...

  4. 实体linux服务器-由自动ip改为固定ip后,无法上网问题--配置问题解法

    新入公司,研发产业为零,开始搞. linux之前是自动获取ip地址的,网上搜索的帖子,耍流氓的居多,不能上网的原因很多,我这个是配置不对,看是否与你的一样. 1.首先看下当前电脑网卡,根据地址可以判断 ...

  5. css实现气泡提示框三角及css中drop-shadow的使用

    css 做一个弹出气泡,样式怎么设计? 难点: 要实现白色三角型,可以在伪元素before和after上设置一个黑.一个白三角形,白三角形会挡住黑的,从而实现. &::before, & ...

  6. Java 效率工具, 大幅度提高开发效率

    你是否有遇到过这样的情况,在开发过程中需要比较两列数据,但使用文本比对工具的话他是按行基准比对的,我还得对每列数据先进行排序,但排序又去哪里排, 想到 excel 可以排序 , 折腾下来,特别麻烦, ...

  7. Python技法:实用运维脚本编写(进程/文件/目录操作)

    Python在很大程度上可以对shell脚本进行替代.笔者一般单行命令用shell,复杂点的多行操作就直接用Python了.这篇文章就归纳一下Python的一些实用脚本操作. 1. 执行外部程序或命令 ...

  8. AngularJS搭建环境

    一.搭建环境 1.1 调试工具:batarang Chrome浏览器插件 主要功能:查看作用域.输出高度信息.性能监控 1.2 依赖软件:Node.js 下载:https://nodejs.org/e ...

  9. 安装PostgreSQL到CentOS(YUM)

    运行环境 系统版本:CentOS Linux release 7.6.1810 (Core) 软件版本:postgresql-12 硬件要求:无 安装过程 1.安装YUM-PostgreSQL存储库 ...

  10. 《Effective C++》阅读总结(四): 设计、声明与实现

    第四章: 设计与声明 18. 让接口更容易被正确使用,不易被误用 将你的class的public接口设计的符合class所扮演的角色,必要时不仅对传参类型限制,还对传参的值域进一步限制. 19. 设计 ...