[单调队列]烽火传递
烽 火 传 递 烽火传递 烽火传递
题目描述
烽火台又称烽燧,是重要的军事防御设施,一般建在险要或交通要道上。一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息;夜晚燃烧干柴,以火光传递军情,在某两座城市之间有 n 个烽火台,每个烽火台发出信号都有一定代价。为了使情报准确地传递,在连续 m 个烽火台中至少要有一个发出信号。请计算总共最少花费多少代价,才能使敌军来袭之时,情报能在这两座城市之间准确传递。
输入
第一行:两个整数 N,M。其中N表示烽火台的个数, M 表示在连续 m 个烽火台中至少要有一个发出信号。接下来 N 行,每行一个数 Wi,表示第i个烽火台发出信号所需代价。
输出
一行,表示答案。
样例输入
5 3
1
2
5
6
2
样例输出
4
数据范围
对于50%的数据,M≤N≤1,000 。 对于100%的数据,M≤N≤100,000,Wi≤100。
code
#include<stdio.h>
#include<iostream>
using namespace std;
long long n,m,ans=999999999,h=1,t,a[100005],b[100005],c[100005];
int main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;++i)scanf("%lld",&a[i]);
for(int i=1;i<=n;++i){
while(c[i-1]<=c[b[t]] and h<=t)t--;
b[++t]=i-1;
while(b[h]<i-m and h<=t)h++;
c[i]=c[b[h]]+a[i];
}
for(int i=n-m+1;i<=n;++i)
ans=min(ans,c[i]);
printf("%lld\n",ans);
return 0;
}