162:Post Office

162:Post Office

总时间限制: 
1000ms

内存限制: 
65536kB
描述
There is a straight highway with villages alongside the highway. The highway is represented as an integer axis, and the position of each village is identified with a single integer coordinate. There are no two villages in the same position. The distance between two positions is the absolute value of the difference of their integer coordinates.

Post offices will be built in some, but not necessarily all of the villages. A village and the post office in it have the same position. For building the post offices, their positions should be chosen so that the total sum of all distances between each village and its nearest post office is minimum.

You are to write a program which, given the positions of the villages and the number of post offices, computes the least possible sum of all distances between each village and its nearest post office. 

输入
Your program is to read from standard input. The first line contains two integers: the first is the number of villages V, 1 <= V <= 300, and the second is the number of post offices P, 1 <= P <= 30, P <= V. The second line contains V integers in increasing order. These V integers are the positions of the villages. For each position X it holds that 1 <= X <= 10000.
输出
The first line contains one integer S, which is the sum of all distances between each village and its nearest post office.
样例输入
10 5
1 2 3 6 7 9 11 22 44 50
样例输出
9
来源
IOI 2000
/*1、考虑在V个村庄中只建立一个邮局的情况,显然可以知道,将邮局建立在中间的那个村庄即可。也就是在a到b间建立

一个邮局,若使消耗最小,则应该将邮局建立在(a+b)/2这个村庄上。

2、下面考虑建立多个邮局的问题,可以这样将该问题拆分为若干子问题,在前i个村庄中建立j个邮局的最短距离,是

在前k个村庄中建立j-1个邮局的最短距离与 在k+1到第i个邮局建立一个邮局的最短距离的和。而建立一个邮局我们在

上面已经求出。

3、状态表示,由上面的讨论,可以开两个数组

dp[i][j]:在前i个村庄中建立j个邮局的最小耗费

sum[i][j]:在第i个村庄到第j个村庄中建立1个邮局的最小耗费

那么就有转移方程:dp[i][j] = min(dp[i][j],dp[k][j-1]+sum[k+1][i]) DP的边界状态即为dp[i][1] = sum[1][i];

所要求的结果即为dp[V][P];

4、然后就说说求sum数组的优化问题,可以假定有6个村庄,村庄的坐标已知分别为p1,p2,p3,p4,p5,p6;那么,如果要

求sum[1][4]的话邮局需要建立在2或者3处,放在2处的消耗为p4-p2+p3-p2+p2-p1=p4-p2+p3-p1放在3处的结果为p4-

p3+p3-p2+p3-p1=p4+p3-p2-p1,可见,将邮局建在2处或3处是一样的。现在接着求sum[1][5],现在处于中点的村庄是

3,那么1-4到3的距离和刚才已经求出了,即为sum[1][4],所以只需再加上5到3的距离即可。同样,求sum[1][6]的时候

也可以用sum[1][5]加上6到中点的距离。所以有递推关系:sum[i][j] = sum[i][j-1] + p[j] -p[(i+j)/2] */

#include<iostream>using namespace std;int dp[310][40] = {}, sum[310][310] = {}, loc[310] = {};int main() {    int V, P;    cin >> V >> P;    for (int i = 1; i <= V; i++) cin >> loc[i];    for (int i = 1; i < V; i++)        for (int j = i + 1; j <= V; j++)            sum[i][j] = sum[i][j - 1] + loc[j] - loc[(i + j) / 2];    for (int i = 1; i <= V; i++) dp[i][1] = sum[1][i];    for (int k = 2; k <= P; k++)        for (int j = k + 1; j <= V; j++) {            dp[j][k] = 0x7FFFFFFF;            for (int i = k - 1; i < j; i++)                dp[j][k] = min(dp[j][k], dp[i][k - 1] + sum[i + 1][j]);        }    cout << dp[V][P] << endl;}
时间: 2024-12-18 08:36:13

162:Post Office的相关文章

noi 162 post office dp

大致题意: 有v个村庄,每个村庄有各自的位置,且每个位置互不相同.现在要在村庄上设立P个邮局,使每个村庄到最近的邮局的距离之和最小. 分析: 定义状态d[i][j]表示前i个村庄,在这i个村庄中设立j个邮局的最小距离.s[i][j]表示村庄i至村庄j这几个村庄中设立一个邮局的最小距离.如果设立一个邮局,那么邮局设立在(a+b)/2这个位置是最优的.所以可以分解成以下子问题: d[i][j]的最小值为d[k][j-1]的最小值加上s[k+1][i],s[k+1][i]为在k+1至i这几个村庄中设立

Office转SWF的一些感想(Office2007和Office2010)

Office2007需要借助SaveAsPDFandXPS的插件完成,Office2010可以直接兼容. Office2PDF主要采用的是 Microsoft.Office.Interop的方式进行,PDF2SWF主要采用的是SWFTools的pdf2swf工具.至于SWFTools的各种命令,网上有很多的资料可以参考,这里就不一一举例了. 1 /// <summary> 2 /// 把Word文件转换成为PDF格式文件 3 /// </summary> 4 /// <par

sharepoint 2013 和 office web apps server 2013集成

环境: 三台服务器  系统:window 2008 R2server01: 192.168.10.162(office web app)server02: 192.168.10.163(AD)server03: 192.168.10.164(sharepoint) 前提:1. server02配置好AD      2. server01和 server03 这两台服务器修改好机器名,加入域. 安装office web app:在server01上安装office web app   1)安装 .

&lt;add assembly=&quot;Microsoft.Office.Tools.Word, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F

Server Error in '/' Application. Configuration Error Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appr

转:VB.NET Office操作之Word

在这里给出了一个Word操作的类,该类具备了对word 文档操作的基本功能,包括word 文档的新建,打开,保存,另存,插入图片,插入表格,插入文字,读取文字,定位光标位置,移动光标,移动到指定页等等操作.在下一篇文章中我将给出这个类实现的实例,读者可以借鉴下程序引用的是Microsoft Word 14.0 Object Library 使用word 2007 +VS2010 1 '********************************************************

CVE-2017-11882复现-office命令执行

0x01 前言 11月14日,微软按照惯例发布了11月的安全更新,随后不久,安全公司EMBEDI在官方博客上公开了其向微软提交的编号为CVE-2017-11882的Office远程代码执行漏洞: https://embedi.com/blog/skeleton-closet-ms-office-vulnerability-you-didnt-know-about 讲述了他们如何发现这个漏洞的过程,并揭露了该漏洞的部分技术细节,不过没有公开漏洞验证代码(PoC). 我们根据EMBEDI的这篇报告,

IT270 Final #1 (ID:162 - AKA THANOS)

Final #1 (ID:162 - AKA THANOS)IT270ALEXANDER PELAEZInstructions.Please make sure if you use R you copy and paste it into Word using Courier Font (makes it easier to Read). For each of the problems that are looking for a response (not just a calculati

Office远程代码执行漏洞CVE-2017-0199复现

在刚刚结束的BlackHat2017黑帽大会上,最佳客户端安全漏洞奖颁给了CVE-2017-0199漏洞,这个漏洞是Office系列办公软件中的一个逻辑漏洞,和常规的内存破坏型漏洞不同,这类漏洞无需复杂的利用手法,直接就可以在office文档中运行任意的恶意脚本,使用起来稳定可靠,故而非常适合于漏洞学习新手测试调试使用,作为一个已经测试过该漏洞的新手,现将搭建环境和测试的全部过程呈献给大家,希望能对大家的学习有所帮助. CVE-2017-0199实际上包含两个漏洞,其中一个称为"RTF URL

如何用代码读取Office Online Server2016的文档的备注信息

前言 在一个项目上客户要求读取office online server 2016的对文档的备注信息,如下图: 以前思路老纠结在OOS这个在线上,总有以为这个信息存储在某个列表中,其实错了,这个备注信息其实就是word文档的备注信息,微软采用openxml开发的OOS,因此我也采用openxml读取备注信息的思路进行尝试,结果发现原来是可以的,成功效果图如下: 注意: OpenXml格式只有office2007以及以上版本才支持的格式,如果office97-2003格式的文档是二进制格式的文档,o