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,模拟赛里那道题的 ...
随机推荐
- 转:学习linux驱动经典书籍
Linux驱动学习的最大困惑在于书籍的缺乏,市面上最常见的书为<linux_device_driver 3rd Edition>,这是一本很经典的书,无奈Linux的东东还是过于庞大,这本 ...
- Andriod三步学会安卓自己定义视图及其属性
第一步:自己定义属性 第二步:自己定义控件解析属性 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcm5adW9adW8=/font/5a6L5L2T/fo ...
- Ubuntu16.04下屏幕侧边栏的设置
ubnutu的任务栏都是在左侧: zhang@zhang-virtual-machine:~$ gsettings set com.canonical.Unity.Launcher launcher- ...
- Kristen Grauman
http://www.cs.utexas.edu/~grauman/ CV Publications Code Data Short ...
- 生产制造追溯系统-IQC来料检验
前言 相信大家都知道,任何一家工厂都有自己的仓库,用来存储采购回来的物料,那么在供应商将我们采购的物料送到工厂之后,我们都需要一个检验动作,也就是今天要说的===>IQC来料检验,这个检验动作是 ...
- MyBatis学习(一):简单的运行
1.准备工作 jar包: mybatis-3.4.4.jar,下载地址:https://github.com/mybatis/ignite-cache/releases mysql-connector ...
- 腾讯云centos,nginx安装
- 解决Android Studio下Element layer-list must be declared问题
近期将一个项目从Eclipse转到Android Studio. 项目中使用了环信demo中的一些xml资源,转换后发现color资源目录下诸如layer-list或者shape等标签报Element ...
- IP address could not be resolved: Name or service not known
[root@test ~]# /usr/local/mysql/bin/mysqld2018-08-05T07:00:33.647509Z 0 [Warning] [MY-011070] [Serve ...
- delphi android 录像(使用了JMediaRecorder,MediaRecorder的使用方法)
delphi xe系列自带的控件都无法保存录像,经网友帮忙,昨天终于实现了录像功能(但有个问题是录像时无画面显示),程序主要使用了JMediaRecorder,MediaRecorder的使用方法可参 ...