烽火传递

来源:互联网 发布:云代账软件收费吗 编辑:程序博客网 时间:2024/04/27 19:20

描述 Description

  烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上。一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情。在某两座城市之间有n个烽火台,每个烽火台发出信号都有一定的代价。为了使情报准确的传递,在m个烽火台中至少要有一个发出信号。现输入n、m和每个烽火台发出的信号的代价,请计算总共最少需要话费多少代价,才能使敌军来袭之时,情报能在这两座城市之间准确的传递!!!

输入格式 InputFormat

第一行有两个数n,m分别表示n个烽火台,在m个烽火台中至少要有一个发出信号。

第二行为n个数,表示每一个烽火台的代价。

输出格式 OutputFormat

一个数,即最小代价。

样例输入 SampleInput

5 3

1 2 5 6 2

样例输出 SampleOutput

4

这算是一个单调队列与动态规划简单合并的一个水题,但是真正搞懂以后还是感觉代码超赞的

#include <stdio.h>#include <iostream>#include <string.h>#include <algorithm>using namespace std;const int INF=1<<30;int q[100005],a[1000005],f[1000005];int main(){    int n,i,k;   while (~scanf("%d%d",&n,&k))   {       int l=0,r=0;       for (i=1;i<=n;i++)        scanf("%d",&a[i]);       for (i=1;i<=n;i++)        {            while (l<=r&&q[l]<i-k)                l++;                f[i]=a[i]+f[q[l]];            while (l<=r&&f[q[r]]>f[i])                r--;                q[++r]=i;        }        int Min=INF;        for (i=n-k+1;i<=n;i++)            Min=min(Min,f[i]);        printf("%d\n",Min);   }    return 0;}


0 0