[单调队列]烽火传递

烽 火 传 递 烽火传递


题目描述

烽火台又称烽燧,是重要的军事防御设施,一般建在险要或交通要道上。一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息;夜晚燃烧干柴,以火光传递军情,在某两座城市之间有 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
#include
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;
}

你可能感兴趣的:(单调队列)