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

    一.通过Charles抓包,可拦截请求并篡改交互信息 1.可篡改客户端向服务器发起的请求信息(服务器收到的是假消息) 2.可篡改服务器返回给客户端的响应结果(客户端看到的是假消息) 二.篡改用户请求 ...

  2. 【luogu P3609 [USACO17JAN]Hoof, Paper, Scissor蹄子剪刀布】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3609 ### 看着标签什么记搜什么暴力点进来,读完题第一直觉DP? 还真是个\(DP\). 题目所描述的状态 ...

  3. CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第六节

    原文链接 第六节:全局内存和CUDA RPOFILER  Rob Farber 是西北太平洋国家实验室(Pacific Northwest National Laboratory)的高级科研人员.他在 ...

  4. SQL小知识_长期总结

    1. 左联接右联接区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner ...

  5. Drupal常用的模块

    CCK (Content Construction Kit ) : 添加字段模块 Views:生成列表 Tinymce:(Wysiwyg Editor) 常用的编辑器之一 Ajax Form Buil ...

  6. Oracle 换行符 空格符 回车符

    ① 换行符 chr(10)② 回车符 chr(13) ③ 空格符 chr(9) 例1:效果对比.chr(10)在一个字段中换行显示一列数据,chr(13)同样是换行显示一行数据,chr(9)会显示一个 ...

  7. ios swift 里面关于变量 常量 可选类型 控制流的一些心得

    //swift 里面没有头文件和实现文件.只有一个.swift文件 //swift 里面没有main的概念,程序从main.swift开始执行 //swift 每一条执行语句可以不用分号结束,多条语句 ...

  8. JavaScript常用八种继承方案

    更新:在常用七种继承方案的基础之上增加了ES6的类继承,所以现在变成八种啦,欢迎加高级前端进阶群一起学习(文末). --- 2018.10.30 1.原型链继承 构造函数.原型和实例之间的关系:每个构 ...

  9. php 获取 今天、昨天、这周、上周、这月、上月、近30天

    <?php //今天 $today = date("Y-m-d"); //昨天 $yesterday = date("Y-m-d", strtotime( ...

  10. webpack的配置处理

    1.webpack对脚本的处理 1.Js用什么loader加载? 1>webpack 本身就支持js的加载, 2>通过babel-loader ES2015 加载js,再用 babel-p ...