Mice and Holes
题意:
有 $n$ 只老鼠和 $m$ 个鼠洞,第 $i$ 只老鼠的坐标为 $x_i$,第 $j$ 个鼠洞的坐标为 $p_j$ ,容量为 $c_j$。
第 $i$ 只老鼠钻进第 $j$ 个鼠洞的距离为 $|xi-pj|$ ,问所有老鼠都进洞的最小距离总和是多少。
解法:
方法一:
考虑dp
每一个移动无非是$p_i - x_j$,$x_i - p_j$
$f(i,j)$ 表示前 $i$ 个要素,有 $j$ 个mouse没有归属的最小值。
如果当前为mouse
$f(i,j) = min \{ f(i-1,j) - x_i , f(i-1,j-1) + x_i \}$
如果当前为hole
$f(i,j) = min \{ f(i-1,j+k) + k p_i - (c_i - k) p_i \}$
单调队列优化 $O(n^2)$。
然而在hole的个数 ≠ mouse的count的时候,显然是错的。
方法二:
考虑换一个方法dp
注意到最优解时每一个洞主管的 是 位置相邻的连续一段的老鼠,我们先把hole 和mouse排序。
$f(i,j)$ 表示用前 $i$ 个hole 来承接 前 $j$ 个mouse。
$f(i,j) = min \{ f(i-1,k) - S(k) \} + S(j) , (max \{ 0, j-c(i) \} \leq k \leq j)$
单调队列优化 $O(n^2)$
#include <bits/stdc++.h> #define N 5010
#define LL long long
#define INF 0x3f3f3f3f3f3f3f3fLL using namespace std; struct hole
{
int x,cnt;
}b[N]; int n,m,a[N],q[N],st,en;
LL f[N][N],sum[N]; int Abs(int x)
{
if(x<) return -x;
return x;
} bool cmp(hole a,hole b)
{
return a.x<b.x;
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
sort(a+,a+n+);
for(int i=;i<=m;i++) scanf("%d%d",&b[i].x,&b[i].cnt);
sort(b+,b+m+,cmp);
memset(f,0x3f,sizeof(f));
f[][]=;
for(int i=;i<=m;i++)
{
st=, en=;
sum[]=;
for(int j=;j<=n;j++) sum[j]=sum[j-]+(LL)Abs(b[i].x-a[j]);
for(int j=;j<=n;j++)
{
int l = max(,j-b[i].cnt);
while(st<=en && q[st]<l) st++;
LL val = f[i-][j]-sum[j];
while(st<=en && f[i-][q[en]]-sum[q[en]] >= val) en--;
q[++en]=j;
if(st<=en)
{
int k=q[st];
f[i][j] = f[i-][k]+sum[j]-sum[k];
}
}
}
if(f[m][n] < INF) cout << f[m][n] << endl;
else cout << - << endl;
return ;
}
Mice and Holes的更多相关文章
- Codeforces 797 F Mice and Holes
http://codeforces.com/problemset/problem/797/F F. Mice and Holes time limit per test 1.5 ...
- AC日记——Mice and Holes codeforces 797f
797F - Mice and Holes 思路: XXYXX: 代码: #include <cmath> #include <cstdio> #include <cst ...
- Mice and Holes 单调队列优化dp
Mice and Holes 单调队列优化dp n个老鼠,m个洞,告诉你他们的一维坐标和m个洞的容量限制,问最小总距离.1 ≤ n, m ≤ 5000. 首先列出朴素的dp方程:\(f[i][j] ...
- Mice and Holes CodeForces - 797F
Mice and Holes CodeForces - 797F 题意:有n只老鼠和m个洞,都在一个数轴上,老鼠坐标为x[1],...,x[n],洞的坐标为p[1],...,p[m],每个洞能容纳的老 ...
- CF797F Mice and Holes 贪心、栈维护DP
传送门 首先\(\sum c\)有些大,考虑将其缩小降低难度 考虑一个贪心:第一次所有老鼠都进入其左边第一个容量未满的洞(如果左边没有就进入右边第一个未满的洞),第二次所有老鼠都进入其右边第一个容量未 ...
- [Codeforces797F]Mice and Holes
Problem n个老鼠,m个洞,告诉你他们的一维坐标和m个洞的容量限制,问最小总距离. Solution 用dp[i][j]表示前i个洞,进了前j个老鼠的最小代价 dp[i][j]=min(dp[i ...
- [CodeForces-797F]Mice and Holes
题目大意: 在一条直线上,有n个老鼠,m个洞. 每个老鼠i都有一个初始位置x[i]. 每个洞i都有一个固定位置p[i]和容量限制c[i]. 求所有老鼠都进洞的最小距离总和. 思路: 动态规划. 用f[ ...
- Educational Codeforces Round 19
A. k-Factorization 题目大意:给一个数n,求k个大于1的数,乘积为n.(n<=100,000,k<=20) 思路:分解质因数呗 #include<cstdio> ...
- 贪心/构造/DP 杂题选做Ⅲ
颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...
随机推荐
- sonar + ieda实现提交代码前代码校验
代码风格不同一直是一件停头疼的事情,因为不同的工作经验,工作经历,每个人的代码风格不尽相同,造成一些代码在后期的维护当中难以维护, 查阅一些资料之后发现 idea + sonar 的方式比较适合我,实 ...
- 从主机给VM Copy文件
不能从主机给VM 复制文件,在VM里,setting --->option--->shareFolder-->enable-->add(要share的文件路径) then=== ...
- 小贝_mysql主从复制作用以及案例
mysql主从复制 简要: 一.mysql用户授权 二.mysql bin-log日志 三.mysql主从复制 一.mysql用户授权 1.命令 2.作用:进行权限控制 3.样例: (备注: 同意 ...
- kubernetes的Service Account和secret
系列目录 Service Account Service Account概念的引入是基于这样的使用场景:运行在pod里的进程需要调用Kubernetes API以及非Kubernetes API的其它 ...
- kubernetes调度之资源耗尽处理配置
系列目录 本篇将介绍如何使用kubelet处理资源耗尽的情况 当可用的计算机资源非常低的时候,kubelet仍然要保证节点的稳定性.当处理不可压缩的计算机资源(比如内存或磁盘空间)时,这尤其重要,当这 ...
- ZOJ 1516 Uncle Tom's Inherited Land(二分匹配 最大匹配 匈牙利啊)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=516 Your old uncle Tom inherited a p ...
- JAVA RMI远程方法调用简单实例(转载)
来源:http://www.cnblogs.com/leslies2/archive/2011/05/20/2051844.html RMI的概念 RMI(Remote Method Invocati ...
- 在OC项目中实现swift与oc混编 相互引用
--------------------------------------------------------Begin--------------------------------------- ...
- c# vs2010 连接access数据库
第一次在博客园写博文,由于文采不怎么好,即使是自己很熟悉的东西,写起来也会感觉到不知从何讲起,我想写的多了就好了. 这篇文章主要是介绍怎么用c# 语言 vs2010连接access数据库的,连接字符串 ...
- Geoffrey E. Hinton
https://www.cs.toronto.edu/~hinton/ Geoffrey E. Hinton I am an Engineering Fellow at Google where I ...