博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
luogu_P4767 [IOI2000]邮局
阅读量:7124 次
发布时间:2019-06-28

本文共 1247 字,大约阅读时间需要 4 分钟。

Description

高速公路旁边有一些村庄。高速公路表示为整数轴,每个村庄的位置用单个整数坐标标识。没有两个在同样地方的村庄。两个位置之间的距离是其整数坐标差的绝对值。

邮局将建在一些,但不一定是所有的村庄中。为了建立邮局,应选择他们建造的位置,使每个村庄与其最近的邮局之间的距离总和最小。

你要编写一个程序,已知村庄的位置和邮局的数量,计算每个村庄和最近的邮局之间所有距离的最小可能的总和。

Solution

大概是把dp的常见优化的经典练习题都打了一波。

这是四边形不等式优化的题目。证明?百度百科上就很不错了,就不说了。

满足\(f[i][j]\) 的决策点会在\(f[i][j-1]\)\(f[i+1][j]\)的决策点之间

Code

#include
#define ll long long#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} return x*f;}#define MN 3005#define mN 305int V,P,a[MN],f[MN][mN],q[MN],d[MN][MN],g[MN][mN];inline int dis(int l,int r){ if(d[l][r]) return d[l][r]; else return d[l][r]=q[r]+q[l-1]-q[(l+r)>>1]-q[(l+r-1)>>1];}int main(){ V=read();P=read(); memset(f,0x3f,sizeof f); register int i,j,k; for(i=1;i<=V;++i) a[i]=read(),q[i]=q[i-1]+a[i]; std::sort(a+1,a+V+1); for(i=1;i<=V;++i) f[i][1]=dis(1,i); for(g[V+1][k=2]=V;k<=P;++k,g[V+1][k]=V) for(i=V;i>=1;--i)for(j=g[i][k-1];j<=g[i+1][k];++j) if(f[j][k-1]+dis(j+1,i)


Blog来自PaperCloud,未经允许,请勿转载,TKS!

转载于:https://www.cnblogs.com/PaperCloud/p/10242014.html

你可能感兴趣的文章
15. C#数据结构与算法 -- 栈
查看>>
2015年8月27日【文件权限管理及grep正则和扩展正则表达式】-JY1506402-19+liuhui880818...
查看>>
[SSIS] 之七: SSIS 学习之旅 FTP访问类
查看>>
让git push命令不再每次都输入密码 ssh配置_已迁移
查看>>
配置Linux主机SSH无密码访问
查看>>
saltstack 结束正在执行的任务
查看>>
orangepi,linux硬盘自动休眠
查看>>
6个变态的C语言Hello World程序
查看>>
徒手撸出一个类Flask微框架(一) 理解HTTP请求 request和response
查看>>
在 CentOS7 上安裝 VMware vSphere CLI (vcli)
查看>>
《java 2 编程21天自学通》
查看>>
Redis Cluster 3.0搭建与使用
查看>>
H3C IRF原理及 配置
查看>>
《MySQL管理之道:性能调优、高可用与监控》迷你书
查看>>
struts2的method="{1}"
查看>>
【HAVENT原创】修改 CentOS 服务器名称
查看>>
Win2012 R2 Boot Configuration Data is missing
查看>>
搭建以太坊私有链完整版
查看>>
ORACLE SQL*PLUS基础学习笔记
查看>>
“rman target /” 和 “rman nocatalog target /” 区别
查看>>