烽火传递
描述
烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上。一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情。在某两座城市之间有n个烽火台,每个烽火台发出信号都有一定的代价。为了使情报准确的传递,在m个烽火台中至少要有一个发出信号。现输入n、m和每个烽火台发出的信号的代价,请计算总共最少需要花费多少代价,才能使敌军来袭之时,情报能在这两座城市之间准确的传递。
输入格式
第一行有两个数n,m分别表示n个烽火台,在m个烽火台中至少要有一个发出信号。
第二行为n个数,表示每一个烽火台的代价。
输出格式
一个数,即最小代价。
测试样例1
输入
5 3
1 2 5 6 2
输出
4
#include <iostream>
#include <cstring>
#include <cstdio>
#define INF 2100000000
using namespace std;
const int maxn = 1e5+5;
int n,m;
int w[maxn],f[maxn],q[maxn];
int main() {
freopen("fhcd.in","r",stdin);
freopen("fhcd.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++) scanf("%d",&w[i]);
int st = 1, en = 1;
q[1] = f[0] = 0;
for(int i = 1; i <= n; i++) {
while(i-q[st] > m) st++;
f[i] = f[q[st]]+w[i];
while(f[q[en]] >= f[i]) en--;
q[++en] = i;
}
int ans = INF;
for(int i = n; i >= n-m+1; i--) ans = min(ans, f[i]);
printf("%d\n",ans);
return 0;
}