P1313 [NOIP2010初赛]烽火传递
时间: 1000ms / 空间: 131072KiB / Java类名: Main

描述

  烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上。一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情。在某两座城市之间有n个烽火台,每个烽火台发出信号都有一定的代价。为了使情报准确的传递,在m个烽火台中至少要有一个发出信号。现输入n、m和每个烽火台发出的信号的代价,请计算总共最少需要花费多少代价,才能使敌军来袭之时,情报能在这两座城市之间准确的传递。

输入格式

第一行有两个数n,m分别表示n个烽火台,在m个烽火台中至少要有一个发出信号。
第二行为n个数,表示每一个烽火台的代价。

输出格式

一个数,即最小代价。

测试样例1

输入

5 3 
1 2 5 6 2

输出

4

备注

1<=n,m<=1,000,000

先上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 ;
}

前言:

地址:https://baike.baidu.com/link?url=Q1N9tP7fq-tZ3K8K6WWlPChsloP_NHdd_Yydv74xa4NtJZw6uKYxrRM5LndT7foxrrRjQJe6PoeTVdtc9_62uSuKZwdmvpc_-G3eAVkXQyHv_Py9hO4iox3k2yell059

自己对于单调队列的一点理解:

        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初赛]烽火传递+单调队列详细整理的更多相关文章

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

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

  2. 【生活没有希望】NOIP2010初赛 烽火传递 smartoj1475

    整天初赛题做做,生活没有希望 用单调队列优化的dp 因为满足后来的总比先来的(在某些方面)更优 所以能用单调队列 n2变成n #include <cstdio> ],b[],c[]; in ...

  3. 【LOJ#10180】烽火传递 单调队列+dp

    题目大意:给定一个 N 个非负整数数组成的序列,每个点有一个贡献值,现选出其中若干数,使得每连续的 K 个数中至少有一个数被选,要求选出的数贡献值最小. 题解:设 \(dp[i]\) 表示考虑了序列前 ...

  4. joyoi tyvj1313 [NOIP2010初赛]烽火传递

    单调队列优化dp #include <iostream> #include <cstdio> using namespace std; int dp[1000005], n, ...

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

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

  6. 习题:烽火传递(DP+单调队列)

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

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

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

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

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

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

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

随机推荐

  1. objective-c系列-NSMutableArray

    ******************************************** // 可变数组构造方法 //  下边两句的定义都是不可变的 //    NSMutableArray *mar ...

  2. 【Android】Mac安装EasyTether导致无法识别设备的问题

    正文 想让手机走PC网络,然后抓包,于是搜索一番后安装了一个叫EasyTether的软件.还没来得及测试,就忙着写代码去了,重启MAC以后就发现连不上手机了,一开始并没有怀疑是 EasyTether的 ...

  3. php array 分页

    $array=array("1","2","3","4","5","6",&qu ...

  4. ThinkPHP的RBAC原理分析

    转载 http://jingyan.baidu.com/article/a948d65151a4810a2ccd2e60.html 方法/步骤 多用户对节点的操作的权限控制,这句话,经过反复扩展功能, ...

  5. 软工_Alpha阶段事后分析总计

    1.设想和目标 1.1 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件主要解决狼人杀玩家在游戏时的一些痛点.因为之前自己对于游戏中那些不方便的地方有过体 ...

  6. asp.net mvc 应用Bundle(捆绑和微小)压缩技术 启用 BundleConfig 配置web.config

    从MVC4开始,我们就发现,项目中对Global.asax进行了优化,将原来在MVC3中使用的代码移到了 [App_Start]文件夹下,而Global.asax只负责初始化.其中的BundleCon ...

  7. Android简单加密保护自有图片资源

    现在大部分android应用的图片资源,被反编译后就可以直接拿来用,如果不想让自己的图片资源直接被反编译后使用,首先想到的应该是把图片加密.这里笔者抛砖引玉,草草写了一个对图片进行简单加密的方法,希望 ...

  8. jQuery 更改checkbox的状态,无效

    今天写页面遇到复选框动态全选或全不选问题,正常写法如下: $("#tb").find("input[type='checkbox']").attr(" ...

  9. spring的定时任务配置

    本文来源于:http://myspace1916.iteye.com/blog/1570707 也可参考:http://www.oschina.net/question/8676_9032 (个人只是 ...

  10. MongoDB Shard部署及Tag的使用

    Shard部署 准备测试环境 为准备数据文件夹 Cd  /home/tiansign/fanr/mongodb/Shard mkdir configdb1 configdb2 configdb3 mk ...