[NOIP2010初赛]烽火传递+单调队列详细整理
描述
输入格式
第二行为n个数,表示每一个烽火台的代价。
输出格式
测试样例1
输入
5 3
1 2 5 6 2
输出
4
备注
先上50分代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=5e3+;
const int inf=2e9;
int n,m,a[N*];
int dp[N][N];
int dfs(int x,int y){//dp[x][y]表示选到第x个,已经空了y个(没有发出信号)
if(y==m) return inf;
if(x==n+) return ;
if(dp[x+][y+]!=-) dp[x][y]=dp[x+][y+];
else dp[x][y]=dfs(x+,y+);
if(dp[x+][]!=-) dp[x][y]=min(dp[x][y],dp[x+][]+a[x+]);
else dp[x][y]=min(dp[x][y],dfs(x+,)+a[x+]);
return dp[x][y];
}
int main(){
memset(dp,-,sizeof dp);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
dfs(,);
printf("%d",dp[][]);
return ;
}
前言:

自己对于单调队列的一点理解:
for(;l<r&&i-q[l]>m;l++);//队列里一定要有一个元素且不合法才出队(删除前面)
f[i]=f[q[l]]+a[i];//用队首来更新当前f[i]的答案
for(;l<r&&f[q[r]]>f[i];r--);//用当前的f[i]去更新队尾,使队列保持单调性(删除后面)
q[++r]=i;//进队
解析:
设f[i]表示点燃当前位置烽火台,且前i个满足要求的最小代价。
显然就有f[i]=min(f[j])+a[i](i-m<=j<=i-1)。
当然,这会超时,所以要有优化。
优化一:肯定是从前m个里选小的,涉及到区间最小值,可用线段树,时间复杂度将为O(n log m)。
优化二:同样因为要选前m个最小的,使用单调队列,队列里存有不超过m个长度单位的值,每次取队首,进队时维护队列使其单调不下降,复杂度将为O(n)。
(这里主要讲解 优化二即单调队列)
AC代码:
#include<cstdio>
#include<algorithm>
using namespace std;
inline const int read(){
register int x=,f=;
register char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
}
const int N=1e6+;
int n,m,l,r,a[N],f[N],q[N<<];
int main(){
n=read();m=read();
for(int i=;i<=n;i++) a[i]=read();
l=r=;
for(int i=;i<=n;i++){
for(;l<r&&i-q[l]>m;l++);
f[i]=f[q[l]]+a[i];
for(;l<r&&f[q[r]]>f[i];r--);
q[++r]=i;
}
int ans=0x7fffffff;
for(int i=n-m+;i<=n;i++) ans=min(ans,f[i]);
printf("%d",ans);
return ;
}
[NOIP2010初赛]烽火传递+单调队列详细整理的更多相关文章
- [TyvjP1313] [NOIP2010初赛]烽火传递(单调队列 + DP)
传送门 就是个单调队列+DP嘛. ——代码 #include <cstdio> ; , t = , ans = ~( << ); int q[MAXN], a[MAXN], f ...
- 【生活没有希望】NOIP2010初赛 烽火传递 smartoj1475
整天初赛题做做,生活没有希望 用单调队列优化的dp 因为满足后来的总比先来的(在某些方面)更优 所以能用单调队列 n2变成n #include <cstdio> ],b[],c[]; in ...
- 【LOJ#10180】烽火传递 单调队列+dp
题目大意:给定一个 N 个非负整数数组成的序列,每个点有一个贡献值,现选出其中若干数,使得每连续的 K 个数中至少有一个数被选,要求选出的数贡献值最小. 题解:设 \(dp[i]\) 表示考虑了序列前 ...
- joyoi tyvj1313 [NOIP2010初赛]烽火传递
单调队列优化dp #include <iostream> #include <cstdio> using namespace std; int dp[1000005], n, ...
- 2018.09.06 烽火传递(单调队列优化dp)
描述 烽火台是重要的军事防御设施,一般建在交通要道或险要处.一旦有军情发生,则白天用浓烟,晚上有火光传递军情. 在某两个城市之间有 n 座烽火台,每个烽火台发出信号都有一定的代价.为了使情报准确传递, ...
- 习题:烽火传递(DP+单调队列)
烽火传递[题目描述]烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有n个烽火台,每个烽火台 ...
- 刷题总结——烽火传递(单调队列+dp)
题目: 题目描述 烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有 n 个烽火台,每个烽火 ...
- 【烽火传递】dp + 单调队列优化
题目描述 烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有 n 个烽火台,每个烽火台发出信 ...
- 烽火传递【单调队列优化dp】
题目大意: 1.给出长度为n的数组,要求每m个连续的元素之间必须选一个值作为代价,求该数组的最小代价. 题解思路: 1.显然是线性dp,dp[i]表示选择第 i 个元素时的最小总代价.很明显状态转移方 ...
随机推荐
- 安装php扩展
下面我以soap安装为例子 cd /home/zhangy/php-5.2.6/ext/soap /usr/local/php/bin/phpize#确定php-config文件在不在,调用php-c ...
- #一周五# win10通用平台,无处不在的Xamarin,msbuild开源,MVP卢建晖的Asp.NET 5系列 (视频)
又到周五,本周博主的大部分时间都花在深圳了.最近winhec的消息太多了,我只想补充一点,就是winhec时隔7年之后回归,大多数的媒体都还在沿用之前的“硬件工程大会(Hardware Enginee ...
- Linux下python安装升级详细步骤 | Python2 升级 Python3
Linux下python升级步骤 Python2 ->Python3 多数情况下,系统自动的Python版本是2.x 或者yum直接安装的也是2.x 但是,现在多数情况下建议使用3.x 那么如 ...
- ORACLE绑定变量隐式转换导致性能问题
年后一次系统升级后,监控数据库的工具DPA发现数据库的Total Wait时间突然飙增,如下截图所示,数据库的总体等待时间对比升级前飙增了非常多 另外就是发现出现了较多的等待事件,主要有latch: ...
- c#-轮询算法
这两天做东西,业务上有个特殊的需求,在用户访问页面的时候,针对某一行代码进行控制,按照概率来进行显示,我做的是针对当前页面的曝光进行处理,曝光代码是第三方的,页面上只要有这段代码就算是执行了这段曝光代 ...
- Oracle Data Provider for .NET
官方地址: http://www.oracle.com/technetwork/topics/dotnet/index-085163.html 终于有正式版了.不用装客户端,又小,确实好.
- C++/CLI——读书笔记《Visual C++/CLI从入门到精通》 第Ⅰ部分
=================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载 请通过右 ...
- tomcat黑/白名单设置
vim $tomcat_home/conf/server.xml(可以单个IP或者多个ip,多个ip用|分隔,支持正则) <Context path=" reloadable=&quo ...
- JBOSS目录结构详细说明
一.下载与安装. 如何下载以及安装配置,请参考:Windows下JBOSS安装配置图文教程 二.现在主要了解一下JBOSS目录结构. 1. 主目录: E:\jboos\jboss-6.1.0.Fina ...
- Xcode同时兼容Xcode7和Xcode8,两个版本并存,也适用于先升8再安装7
先吐槽一下之前看到的一个教程,如下: 先在应用程序内,拷贝一份之前的xcode,然后再安装新版本,发现这种安装完成就是在之前上面迭代了 有木有?等于没任何作用 我这边就是不小心先升级了8,然后再安装 ...