烽火台又稱烽燧,是重要的防禦設施,一般建在險要處或交通要道上。一旦有敵情發生,白天燃燒柴草,通過濃煙表達資訊:夜晚燃燒乾柴,以火光傳遞軍情。在某兩座城市之間有n個烽火台,每個烽火台發出訊號都有一定的代價。為了使情報準確的傳遞,在m個烽火台中至少要有乙個發出訊號。現輸入n、m和每個烽火台發出的訊號的代價,請計算總共最少需要話費多少代價,才能使敵軍來襲之時,情報能在這兩座城市之間準確的傳遞!!!
第一行有兩個數n,m分別表示n個烽火台,在m個烽火台中至少要有乙個發出訊號。
第二行為n個數,表示每乙個烽火台的代價。
乙個數,即最小代價。
5 31 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,從隊頭向後掃瞄...