烽火傳遞 單調隊列

Description

  烽火臺又稱烽燧,是重要的軍事防禦設施,一般建在險要或交通要道上。一旦有敵情發生,白天燃燒柴草,通過濃煙表達信息;夜晚燃燒乾柴,以火光傳遞軍情,在某兩座城市之間有n個烽火臺,每個烽火臺發出信號都有一定代價。爲了使情報準確地傳遞,在連續m個烽火臺中至少要有一個發出信號。請計算總共最少花費多少代價,才能使敵軍來襲之時,情報能在這兩座城市之間準確傳遞。

Input

  第一行:兩個整數N,M。其中N表示烽火臺的個數,M表示在連續m個烽火臺中至少要有一個發出信號。接下來N行,每行一個數Wi,表示第i個烽火臺發出信號所需代價。

Output

  一行,表示答案。

Sample Input

5 312562

Sample Output

4

HINT

【數據範圍】  對於50%的數據,M≤N≤1,000 。  對於100%的數據,M≤N≤ 100,000,Wi≤100。


#include<stdio.h>
int n,m,r,q[100001],l,a[100001],f[100001],ans;
int main()
{
    scanf("%d%d",&n,&m);
    r=n;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        while(l<r&&i-q[l]>m)
            ++l;
            f[i]=a[i]+f[q[l]];
         
        while(l<r&&f[i]<f[q[r-1]])
            --r;
            q[r++]=i;   
    }
    ans=f[n];
    for(int i=n;i>=n-m+1;i--)
    {
        if(ans>f[i])
        {
            ans=f[i];
        }
    }
    printf("%d",ans);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章