单调队列优化之烽火传递
作者:互联网
#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