习题:烽火传递(DP+单调队列)
烽火传递
【题目描述】
烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上。一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情。在某两座城市之间有n个烽火台,每个烽火台发出信号都有一定的代价。为了使情报准确的传递,在m个烽火台中至少要有一个发出信号。现输入n、m和每个烽火台发出的信号的代价,请计算总共最少需要花费多少代价,才能使敌军来袭之时,情报能在这两座城市之间准确的传递!!!
【输入描述】
第一行有两个数n,m(1<=n,m<=1000000)分别表示n个烽火台,在m个烽火台中至少要有一个发出信号。
第二行为n个数,表示每一个烽火台的代价。
【输出描述】
一个数,即最小代价。
【样例输入】
5 3
1 2 5 6 2
【样例输出】
4
分析:
多增加两个点表示两座城市,将它们看做代价为0的烽火台,然后很容易得到这个式子:
f[i]:=min(f[j])+a[i](i-m<=j<i)
然后用单调队列优化,队列元素保存f数组的值,维护单调递增队列,每次取队头即可。
代码1(DP+单调队列):
program fire;
var
f,a,b,g:array[..]of longint;
n,i,m,h,t:longint;
procedure work(x:longint);
begin
t:=t+; b[t]:=f[x]; g[t]:=x;
while (b[t]<=b[t-])and(t>h) do
begin
t:=t-; b[t]:=b[t+]; g[t]:=g[t+];
end;
if x-g[h]=m then h:=h+;
end;
begin
assign(input,'fire.in');
reset(input);
assign(output,'fire.out');
rewrite(output);
readln(n,m);
for i:= to n do
read(a[i]);
n:=n+;
f[]:=; b[]:=;g[]:=;h:=; t:=;
for i:= to n do
begin
f[i]:=b[h]+a[i];
work(i);
end;
writeln(f[n]);
close(input); close(output);
end.
也可以用堆来优化,每次取的时候判断根节点是否超出范围,超出则删除,继续判断,直到符合要求。
代码2(DP+堆):
program fire;
var
f,a,b,g:array[..]of longint;
n,i,m,t:longint;
function get(x:longint):longint;
var i,s,tmp:longint;
begin
while (x-g[]>m)and(t>) do
begin
b[]:=b[t]; g[]:=g[t];t:=t-;
i:=;
while (i*<=t)or(i*+<=t) do
begin
if (i*+>t)or(b[i*]<b[i*+]) then s:=i* else s:=i*+;
if b[i]>b[s] then
begin
tmp:=b[i]; b[i]:=b[s]; b[s]:=tmp;
tmp:=g[i]; g[i]:=g[s]; g[s]:=tmp;
i:=s;
end else break;
end;
end;
get:=b[];
end;
procedure put(x:longint);
var s,tmp:longint;
begin
t:=t+;b[t]:=f[x];g[t]:=x; s:=t;
while (s<>)and(b[s div ]>b[s]) do
begin
tmp:=b[s div ]; b[s div ]:=b[s]; b[s]:=tmp;
tmp:=g[s div ]; g[s div ]:=g[s]; g[s]:=tmp; s:=s div ;
end;
end;
begin
assign(input,'fire.in');
reset(input);
assign(output,'fire.out');
rewrite(output);
readln(n,m);
for i:= to n do
read(a[i]);
n:=n+;
f[]:=; b[]:=;g[]:=; t:=;
for i:= to n do
begin
f[i]:=get(i)+a[i];
put(i);
end;
writeln(f[n]);
close(input); close(output);
end.
习题:烽火传递(DP+单调队列)的更多相关文章
- 2018.09.06 烽火传递(单调队列优化dp)
描述 烽火台是重要的军事防御设施,一般建在交通要道或险要处.一旦有军情发生,则白天用浓烟,晚上有火光传递军情. 在某两个城市之间有 n 座烽火台,每个烽火台发出信号都有一定的代价.为了使情报准确传递, ...
- 刷题总结——烽火传递(单调队列+dp)
题目: 题目描述 烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有 n 个烽火台,每个烽火 ...
- 烽火传递【单调队列优化dp】
题目大意: 1.给出长度为n的数组,要求每m个连续的元素之间必须选一个值作为代价,求该数组的最小代价. 题解思路: 1.显然是线性dp,dp[i]表示选择第 i 个元素时的最小总代价.很明显状态转移方 ...
- [TyvjP1313] [NOIP2010初赛]烽火传递(单调队列 + DP)
传送门 就是个单调队列+DP嘛. ——代码 #include <cstdio> ; , t = , ans = ~( << ); int q[MAXN], a[MAXN], f ...
- [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)
DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...
- DP+单调队列 codevs 1748 瑰丽华尔兹(还不是很懂具体的代码实现)
codevs 1748 瑰丽华尔兹 2005年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Descripti ...
- (noip模拟二十一)【BZOJ2500】幸福的道路-树形DP+单调队列
Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...
- 3622 假期(DP+单调队列优化)
3622 假期 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 黄金 Gold 题目描述 Description 经过几个月辛勤的工作,FJ决定让奶牛放假.假期可以在1-N天内任意选择 ...
- 【烽火传递】dp + 单调队列优化
题目描述 烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有 n 个烽火台,每个烽火台发出信 ...
随机推荐
- oc引用计数原理-引用计数相关变化
http://blog.csdn.net/null29/article/details/71191044 在 32 位环境下,对象的引用计数都保存在一个外部的表中,每一个对象的 Retain 操作,实 ...
- Linux下bash的快捷键
Ctrl + A :切换到命令行开始 Ctrl + E :切换到命令行末尾 Ctrl + L : 清屏,相当于clear Ctrl + U :清除剪切光标前的内容 Ctrl + K :剪切清除光标后 ...
- 地理位置索引 2d索引
地址位置索引:将一些点的位置存储在mongodb中,创建索引后,可以按照位置来查找其他点 子分类: .2d索引:平面地理位置索引,用于存储和查找平面上的点. .2dsphere索引:球面地理位置索引, ...
- Problem K: 搜索基础之棋盘问题
Problem K: 搜索基础之棋盘问题 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 92 Solved: 53[Submit][Status][W ...
- 漫谈 Clustering (番外篇): Expectation Maximization
Expectation Maximization (EM) 是一种以迭代的方式来解决一类特殊最大似然 (Maximum Likelihood) 问题的方法,这类问题通常是无法直接求得最优解,但是如果引 ...
- python换行
python中如果一行代码太长,看着不方便时,怎么办? 只需要在需要换行的地方添加上符号 \ 就行了.
- Spring Boot 2.x零基础入门到高级实战教程
一.零基础快速入门SpringBoot2.0 1.SpringBoot2.x课程全套介绍和高手系列知识点 简介:介绍SpringBoot2.x课程大纲章节 java基础,jdk环境,maven基础 2 ...
- Oracle 汇总函数
汇总函数,也叫统计函数.聚合函数.分组函数 汇总函数必须跟 group by 语句一起使用,对数据进行分组汇总. ① 求和:sum(col).列必须是数值. ② 最小值:min(col).列可以是数值 ...
- js display, visible 区别
注意: display:none和visible:hidden都能把网页上某个元素隐藏起来,在视觉效果上没有区别,但是在一些DOM操作中两者有区别: display:none ---不为被隐藏的对象保 ...
- 【数学 随机 技巧】cf364D. Ghd
随机化选讲的例题 John Doe offered his sister Jane Doe find the gcd of some set of numbers a. Gcd is a positi ...