• 烽火传递【单调队列+DP】


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

    备注Hint

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

    思路:
     每连续的m个,至少需要点亮一个,让点亮的花费最小。是个DP,由前往后推,f [ i ] 为点亮第 i 时的最小花费
     难到我的是,j < i - m ,后来,才明白是为了衔接前段
     有时候觉得DP方程很没道理,却又理所应当
     
    bf code
    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    const int MX=1e6+1;
    int a[MX],f[MX];
    
    int main()
    {
    	int n,m;
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;++i) scanf("%d",&a[i]);
    	for(int i=1;i<=n;++i) {
    		int j=i-m;
    		if(j<1) {
    			f[i]=a[i];
    			continue;
    		}
    		int mn=0x7fffffff;
    		for(;j<=i-1;++j) {
    			mn=min(mn,f[j]);
    		}
    		f[i]=mn+a[i];
    	}
    	int ans=0x7fffffff;
    	for(int i=n-m+1;i<=n;++i) ans=min(ans,f[i]); 
    	printf("%d",ans);
    	return 0;
    }
    /*
    4 3
    1 2 5 6 
    
    6 2
    2 1 2 2 1 2
    */
    
    单调队列优化 
     其实优化大多是,减少重复的计算。曾经得到的结论,想办法继承到后面的更新中去
     而单调队列,恰好适用于动态移动、固定区间的最值
     
    code
    #include<stdio.h>
    #include<algorithm> 
    using namespace std; 
    const int MX=1e6+1;
    int a[MX],f[MX],q[MX];
    int head=1,tail=0;
    
    int main() 
    {
    	int n,m;
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;++i) scanf("%d",&a[i]);
    	for(int i=1;i<=n;++i) {
    		while(head<=tail && f[i-1]<=f[q[tail]]) tail--;
    		q[++tail]=i-1;
    		while(head<=tail && q[head]<i-m) head++;
    		f[i]=f[q[head]]+a[i];
    	}
    	int ans=0x7fffffff;
    	for(int i=n-m+1;i<=n;++i) ans=min(ans,f[i]);
    	printf("%d",ans); 
    	return 0;
    }
     
     
  • 相关阅读:
    BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
    众王谈判三 谈判
    众王谈判二 来客
    众王谈判一 陨星
    边缘长梦
    Lua笔记
    来从蜀国游 5
    来从蜀国游 4
    来从蜀国游 3
    来从蜀国游 2
  • 原文地址:https://www.cnblogs.com/qseer/p/13735603.html
Copyright © 2020-2023  润新知