tyvj1313 烽火傳遞

2021-07-09 10:30:17 字數 1004 閱讀 7366

烽火台又稱烽燧,是重要的防禦設施,一般建在險要處或交通要道上。一旦有敵情發生,白天燃燒柴草,通過濃煙表達資訊:夜晚燃燒乾柴,以火光傳遞軍情。在某兩座城市之間有n個烽火台,每個烽火台發出訊號都有一定的代價。為了使情報準確的傳遞,在m個烽火台中至少要有乙個發出訊號。現輸入n、m和每個烽火台發出的訊號的代價,請計算總共最少需要話費多少代價,才能使敵軍來襲之時,情報能在這兩座城市之間準確的傳遞!!!

第一行有兩個數n,m分別表示n個烽火台,在m個烽火台中至少要有乙個發出訊號。

第二行為n個數,表示每乙個烽火台的代價。

乙個數,即最小代價。

5 3 

1 2 5 6 2

4

1<=n,m<=1,000,000

【題解】

和修剪草坪那道題很像。也可以用單調佇列來優化。

f[i]表示以i為結尾,i必選,所獲得的最小代價。

那麼f[i]就可以表示為前乙個狀態的最小值(必須在i前面的m個里)再加上當前的值(因為i必選),可以用單調佇列來優化成o(n)

【**】

#include#include#include#define inf 2100000000 

using namespace std;

int n,m,head,tail,min;

int queue[1000005],a[1000005],f[1000005];

int main()

min=inf;

for (int i=n-m+1;i<=n;++i)

min=min(min,f[i]);

printf("%d\n",min);

}

再說一下細節問題:

①先調整單調佇列的範圍,再更新當前的f

②可選與不可選的範圍要注意

③狀態的表示決定了最後需要列舉最小值,但是這個列舉必須從n-m+1開始,因為最後m個里必選乙個

TYVJ 1305 最大子序和 烽火傳遞

描述 輸入乙個長度為n的整數序列,從中找出一段不超過m的連續子串行,使得整個序列的和最大。例如 1,3,5,1,2,3 當m 4時,s 5 1 2 3 7 當m 2或m 3時,s 5 1 6 第一行兩個數n,m 第二行有n個數,要求在n個數找到最大子序和 乙個數,數出他們的最大子序和 6 4 1 3...

烽火傳遞 單調佇列

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

《單調佇列》3 烽火傳遞

正如度娘說了 由於單調佇列的隊頭每次一定最小值,故查詢為o 1 進隊出隊稍微複雜點 進隊時,將進隊的元素為e,從隊尾往前掃瞄,直到找到乙個不大於e的元素d,將e放在d之後,捨棄e之後的所有元素 如果沒有找到這樣乙個d,則將e放在隊頭 此時佇列裡只有這乙個元素 出隊時,將出隊的元素為e,從隊頭向後掃瞄...