162:Post Office 修建问题。

地址: http://noi.openjudge.cn/ch0206/162/

解题思路

设置F[p][v]表示V个village中修建p个邮局使得所有村庄到最近邮局的距离最近。
得到了如下递推公式:
F[p][v] = min{F[p][v], F[p-1][k-1]+ dis[k][v]};
为什么这样进行递推?这是因为本题目中以最后一个邮局所属的村庄进行划分,因为总有一些village到最后一个邮局的距离是最近的,但是这些村子的数量不知道,我们需要知道到底多少village划归到最后一个post office的时候是最优的。

但是我们知道,能够划分到最后一个post office的village,至少是第p个,修建之前的p-1个post office,至少需要p-1个village。因此有如下等式:

p-1<=k-1<=v

递推式表示在前面k-1个village中修建p-1个post office,随后的第k个village到第v个village,修建最后一个post office, dis[k][v]表示在第k个village和第v个village中修建1个post office时各个village到这个post office的距离之和的最小值。

现在需要解决如下问题,dis[k][v]如何计算?
在k和v之间修建一个post office,同时所有village到该post office的距离最小,该如何计算呢?正确计算方法是将post office修建到这些village的中位数中。

假设范围是i和j-1之间的中位数中修建了一个post office,最优值为dis[i][j-1],现在当新加入一个village j之后。假设i和j-1之间的中位数是K,新加入j之后选择L作为新的post office 位置。现在分情况讨论:

  • 如果原本i和j之间有奇数个village,新加入一个j之后,仍然可以取原来的K作为中位数,此时中位数位置不变,所以 dis[i,j] = dis[i,j-1]+village[j] - village[(j+i)/2]
  • 如果原本i和j之间有偶数个village,假设此时post office的修建地址设置为中位数中较大的数的位置,此时新加入j后,post office的位置不发生改变,那么仍然由如下计算公式: dis[i,j] = dis[i,j-1]+village[j] - village[(j+i)/2]

综上,可以得出:

dis[i,j] = dis[i,j-1]+village[j] - village[(j+i)/2]

源代码

#include<cstdio>
#include<vector>
#include<cmath>
#include<algorithm>
#include<climits>
using namespace std;int solution(vector<int>& village, int officeCount) {vector<vector<int>> F(officeCount + 1, vector<int>(village.size(), 0));vector<vector<int>> dis(village.size(), vector<int>(village.size(), 0));for (int i = 1; i < village.size(); ++i){for (int j = i+1; j < village.size(); ++j) {int k1 = (i + j - 1) >> 1;int  k2 = (i + j) >> 1;dis[i][j] = dis[i][j - 1] + village[j] - village[(i+j)/2];}}for (int v = 1; v < village.size(); ++v)F[1][v] = dis[1][v];for (int p = 2; p <= officeCount; ++p){for (int v = p; v < village.size(); ++v) {F[p][v] = INT_MAX;for (int k = p; k <=v; ++k)F[p][v] = min(F[p][v],F[p-1][k-1]+dis[k][v]);}}return F[officeCount][village.size() - 1];
}int main() {int V, P;while (scanf("%d %d", &V, &P) != EOF) {    vector<int> village(V+1, 0);for (int i = 1; i <= V; ++i)scanf("%d", &village[i]);printf("%d\n",solution(village, P));}
}

时间复杂度

上述代码的时间复杂度为O(pV^2)

post office 问题相关推荐

  1. 计算机二级函数知识,2017年全国计算机二级考试MS Office高级应用知识点:INDIRECT函数...

    INDIRECT函数知识点 适用考试:全国计算机二级考试 考试科目:MS Office高级应用 科目知识点:INDIRECT函数 INDIRECT函数立即对引用进行计算,并显示其内容.当需要更改公式中 ...

  2. 计算机二级ms office excel,计算机二级Msoffice考试excel答案.docx

    操作题1: 1.解题步骤: 步骤1:启动考生文件下的"Excel. xlsx",打开"订单明细表"工作表. 步骤2:选中工作表中的A2:H636,单击[开始]选 ...

  3. 仿百度文库方案[openoffice.org 3+swftools+flexpaper](三) 之 使用JODConverter将office文档转换为pdf...

    第三步,使用JODConverter将office文档转换为pdf JODConverter是一个java的OpenDucument文件转换器,可以进行许多文件格式的转换,它利用 OpenOffice ...

  4. 和Office一起做减肥操

    随着微软公司的不断开发,Microsoft Office这款大家熟悉的软件真是越来越好用.可是随着版本的更新,软件的身材却越来越"肥胖",于是很多朋友总想知道如何给它们" ...

  5. 计算机rsnge指令,计算机二级office Excel 函数复习重点

    原标题:计算机二级office Excel 函数复习重点 计算机二级来袭! 近期,计算机二级考试即将开始,小编在这里为大家奉上众多难点中的一个考点的详解--<excel函数的应用>,希望能 ...

  6. XDOC Office Server 开源了,Office文档完美转换为PDF

    百度智能云 云生态狂欢季 热门云产品1折起>>>   项目地址:https://gitee.com/xdoc/xoffice XDOC是一个文档自动化平台,提供免费的Office文档 ...

  7. VDI序曲二十三 制作OFFICE 2003应用程序虚拟化序列

    APP-V平台由三个重要组件构成:APP-V排序器.用于虚拟应用程序交付和管理的APP-V管理和流式处理服务器以及APP-V客户端.并且在虚拟环境中不会包含不必要的文件和设置,让IT管理员按需交付应用 ...

  8. Lync server 2013 之office web apps server 搭建步骤

    office web apps server 搭建步骤: 一. .NET Framework 4.5 节点下的HTTP 激活 .NET Framework 3.5 Windows Identity F ...

  9. Office 2016使用NTKO OFFICE控件提示“文件存取错误”的解决办法

    2019独角兽企业重金招聘Python工程师标准>>> 之前使用NTKO,电脑安装的说OFFICE2007,但是前2天电脑固态硬盘坏了 ,重新安装了系统,安装的说win10和offi ...

  10. Office 365 系列之一:初识Office 365

    最近项目越来越多,压力也是越来越大,而且到了年底了还要进行Office 365的考试,最近小编是在闲暇之余各种查看Office 365的资料,今天跟大家分享自己对 Office 365 的学习和理解, ...

最新文章

  1. LTE基带芯片出货量首次超过50%
  2. mysql 查询表结构 几种方法
  3. 【调参实战】那些优化方法的性能究竟如何,各自的参数应该如何选择?
  4. 微内核和宏内核的区别_8086微处理器中的过程和宏之间的区别
  5. 一些简单有趣的c语言编程,一个有趣的小程序
  6. Extjs, each中实现break、continue
  7. 小D课堂 - 新版本微服务springcloud+Docker教程_6-02 springcloud网关组件zuul
  8. spring security实战 3-使用授权码模式( Authorization Code grant)保护资源
  9. h5微信f分享链接给对方获取对方手机号_免费微信电子贺卡制作|微请柬
  10. android蓝牙耳机来电铃声,Android实现积极连接蓝牙耳机
  11. 一丶exit(1)丶exit(0)和return的区别
  12. 国标视频云服务平台EasyGBS出现只能通过录像机观看的情况该如何解决?
  13. Win10GodMode上帝模式
  14. 免费领百度网盘会员!抓紧!
  15. 面试施工员的时候你知道会问什么问题吗?
  16. Hadoop的序列化和反序列化
  17. 【计算机图形学】c++ OpenGL 二维变换(包括多边形绘制、平移、旋转及缩放)
  18. 【前端】Angular的布局(响应式布局)笔记3
  19. Rxjava2原理流程+操作符+线程切换 浅析~
  20. android接私活的网址

热门文章

  1. 500 Internal Privoxy Error
  2. 文本框透明CSS样式
  3. 爱做梦的人工智能「Stabled Diffusion」
  4. 不断的重复重复重复,再重复
  5. Xcode8.2 真机测试 ,添加iOS10.3的idk到Xcode8.2中
  6. 【计算机视觉】MAE:Masked Autoencoder
  7. OpenCL 是什么
  8. Vue.use 是⼲什么的?
  9. JS相关环境搭建:Nodejs、karma测试框架、jsDuck、Express
  10. 选择WordPress 主机空间需要注意什么?