其他分享
首页 > 其他分享> > 单调队列优化之烽火传递

单调队列优化之烽火传递

作者:互联网

#include<iostream>
using namespace std;
/*
(烽火传递)
烽火台是重要的军事防御设施,一般建在险要处或交通要道上。
在两座城市之间有n个烽火台,每个烽火台发出信号都有一定的代价。
为了使情报准确地传递,在连续的m个烽火台中至少要有一个发出信号。
现输入n、m和每个烽火台发出信号的代价,请计算总共最少花费多少代价,才能使敌军来袭之时,情报能在这两座城市之间准确传递。
例如,有5个烽火台,它们发出信号的代价依次为1,2,5,6,2,且m为3,则总共最少花费代价为4,即由第2个和第5个烽火台发出信号。
*/
//f[i]表示在当前位置发出信号,目前的所有烽火台付出的最小代价 
//状态转移方程为f[i]=min(f[j])+a[i] j:i-m->i-1 
int a[10005],f[10005],que[10005];
int head,tail;
int n,m,ans; 
int main(){
    cin>>n>>m;
    head=tail=0;
    f[0]=0;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++){
        while(head<=tail&&que[head]<i-m)head++;
        f[i]=a[i]+f[que[head]];
        while(head<=tail&&f[que[tail]]>f[i])tail--;
        que[++tail]=i;
    }
    ans=0x7fffffff;
    for(int i=n-m+1;i<=n;i++)
        ans=min(ans,f[i]);
    cout<<ans;
    return 0;
}

 

标签:10005,烽火台,队列,int,tail,烽火,代价,发出信号,单调
来源: https://www.cnblogs.com/lyt888/p/12607528.html