tyvj P1313 [NOIP2010初赛]烽火传递
来源:互联网 发布:laravel 实战开发知乎 编辑:程序博客网 时间:2024/04/28 18:42
描述
烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上。一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情。在某两座城市之间有
输入格式
第一行有两个数
第二行为
输出格式
一个数,即最小代价。
测试样例1
输入
5 3 1 2 5 6 2
输出
4
备注
solution
首先转换一下问题,该问题可以转换成在所给的序列中选几个数,相邻的数字位置差
≤m ,并且和最小令
f[i] 表示只考虑1−i ,第i 个数字被选出的最小和那状态转移方程显然是
f[i]=w[i]+min{f[j]} ,其中j−i 的距离≤m ,即i−m≤j≤i−1 考虑
f[i+1] ,转移的时候j 的范围是i−m+1≤j≤i 我们把这两个范围在数轴上表示一下
- 不难看出仅仅是在后面删除了一个数
i−m ,前面新加入了i ,这样就可以用单调队列来优化了
code
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;template<typename T>void input(T &x) { x=0; T a=1; register char c=getchar(); for(;c<'0'||c>'9';c=getchar()) if(c=='-') a=-1; for(;c>='0'&&c<='9';c=getchar()) x=x*10+c-'0'; x*=a; return;}#define MAXN 1000010int w[MAXN];int f[MAXN];int q[MAXN];int head,tail;int main() { int n,m; input(n),input(m); for(int i=1;i<=n;i++) input(w[i]); for(int i=1;i<=n;i++) { while(head<=tail&&f[q[tail]]>=f[i-1]) tail--; q[++tail]=i-1; while(q[head]<i-m) head++; f[i]=w[i]+f[q[head]]; } int ans=2147483647; for(int i=n;i>n-m;i--) ans=min(ans,f[i]); printf("%d\n",ans); return 0;}
阅读全文
0 0
- tyvj P1313 [NOIP2010初赛]烽火传递
- NOIP2010初赛 烽火传递
- 【NOIP2010初赛】【斜率优化】【DP】烽火传递 题解
- 烽火传递NOIP2010
- NOIP2010 烽火传递 队列DP
- TYVJ 1305 最大子序和 ++ 烽火传递
- 烽火传递
- 烽火传递
- 烽火传递
- 烽火传递
- 烽火传递
- noip2010初赛-哥德巴赫猜想
- 【tyvj1313】烽火传递
- NKOI 2151 烽火传递
- 烽火传递 单调队列
- TYVJ 1403 [NOIP2010]关押罪犯
- Tyvj P1403 [NOIP2010]关押罪犯
- <单调队列>3.烽火传递
- oracle的select into和冒号等于的两种赋值方式
- Quartz-Java Web项目中使用Quartz
- win10 资源管理器无限闪退
- jquery获取数据赋值到datagrid复选框
- Android每次编译kernel时间都会改变(不让它改变)
- tyvj P1313 [NOIP2010初赛]烽火传递
- [C# 网络编程系列]专题四:自定义Web浏览器
- Eclipse启动Tomcat访问不了首页(转)
- UVa11613
- vue钩子函数 --已用,没有的用到之后更新
- Android 6.0 运行时权限处理
- C++通过JVM调用jar包
- phpstorm 2017.1 激活
- TCP/IP/端口概述