烽火传递
【题目描述】
烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上。一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情。在某两座城市之间有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+单调队列)的更多相关文章

  1. 2018.09.06 烽火传递(单调队列优化dp)

    描述 烽火台是重要的军事防御设施,一般建在交通要道或险要处.一旦有军情发生,则白天用浓烟,晚上有火光传递军情. 在某两个城市之间有 n 座烽火台,每个烽火台发出信号都有一定的代价.为了使情报准确传递, ...

  2. 刷题总结——烽火传递(单调队列+dp)

    题目: 题目描述 烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有 n 个烽火台,每个烽火 ...

  3. 烽火传递【单调队列优化dp】

    题目大意: 1.给出长度为n的数组,要求每m个连续的元素之间必须选一个值作为代价,求该数组的最小代价. 题解思路: 1.显然是线性dp,dp[i]表示选择第 i 个元素时的最小总代价.很明显状态转移方 ...

  4. [TyvjP1313] [NOIP2010初赛]烽火传递(单调队列 + DP)

    传送门 就是个单调队列+DP嘛. ——代码 #include <cstdio> ; , t = , ans = ~( << ); int q[MAXN], a[MAXN], f ...

  5. [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)

    DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...

  6. DP+单调队列 codevs 1748 瑰丽华尔兹(还不是很懂具体的代码实现)

    codevs 1748 瑰丽华尔兹 2005年NOI全国竞赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述 Descripti ...

  7. (noip模拟二十一)【BZOJ2500】幸福的道路-树形DP+单调队列

    Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...

  8. 3622 假期(DP+单调队列优化)

    3622 假期 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 黄金 Gold 题目描述 Description 经过几个月辛勤的工作,FJ决定让奶牛放假.假期可以在1-N天内任意选择 ...

  9. 【烽火传递】dp + 单调队列优化

    题目描述 烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有 n 个烽火台,每个烽火台发出信 ...

随机推荐

  1. 实现带查询功能的ComboBox控件

    实现效果: 知识运用: ComboBox控件的AutoCompleteMode属性 public AutoCompleteMode AutoCompleteMode{get;set;} //属性值为枚 ...

  2. 解决wget下载https时报错 --no-check-certificate (不检查证书)

    如果使用 wget下载https开头的网址域名 时报错,你需要加上 --no-check-certificate (不检查证书)选项 例如: wget https://pypi.python.org/ ...

  3. Nginx高性能web服务器详解书中概要

    一.Nginx功能 1.Nginx服务器以其功能丰富著称于世.它既可以作为HTTP服务器,也可以作为反向代理服务器或者邮件服务器;能够快速响应静态页面(HTML)的请求;支持FastCGI.SSL.V ...

  4. 去除select下拉框默认样式

    去除select下拉框默认样式 select { /*Chrome和Firefox里面的边框是不一样的,所以复写了一下*/ border: solid 1px #; /*很关键:将默认的select选 ...

  5. vue学习之路 - 4.基本操作(下)

    vue学习之路 - 4.基本操作(下) 简述:本章节主要介绍 vue 的一些其他常用指令. Vue 指令 这里将 vue 的指令分为系统内部指令(vue 自带指令)和用户自定义指令两种. 系统内部指令 ...

  6. 虚拟机Linux_Mint中安装vmtools增强工具

    一开始用VmwarePro安装Linux系统时,系统的整体界面会缩在屏幕中间的一小块区域内.如图: ​ 看的会非常吃力.为了更好的解决这个问题,就需要安装Vmtools增强工具.安装步骤如下: 1. ...

  7. 1911: [Apio2010]特别行动队

    Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 5706  Solved: 2876[Submit][Status][Discuss] Descriptio ...

  8. 详解三种java实现多线程的方式

    java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  9. linux正则表达式扩展部分

    扩展的正则表达式(Extended  Regular  Expressions): 使用的命令为:grep  -E以及egrep [了解即可] 1)+ 表示重复“一个或一个以上”前面的字符(*是0或多 ...

  10. jQuery实现复选框的全选、反选功能

    <ul id="list"> <li><label><input type="checkbox" value=&quo ...