p1313烽火台又稱烽燧,是重要的防禦設施,一般建在險要處或交通要道上。一旦有敵情發生,白天燃燒柴草,通過濃煙表達資訊:夜晚燃燒乾柴,以火光傳遞軍情。在某兩座城市之間有n個烽火台,每個烽火台發出訊號都有一定的代價。為了使情報準確的傳遞,在m個烽火台中至少要有乙個發出訊號。現輸入n、m和每個烽火台發出的訊號的代價,請計算總共最少需要花費多少代價,才能使敵軍來襲之時,情報能在這兩座城市之間準確的傳遞。
第一行有兩個數n,m分別表示n個烽火台,在m個烽火台中至少要有乙個發出訊號。
第二行為n個數,表示每乙個烽火台的代價。
乙個數,即最小代價。
1 2 5 6 2
41<=n,m<=1,000,000
先上50分**:
#include#include前言:#include
using
namespace
std;
const
int n=5e3+10
;const
int inf=2e9;
int n,m,a[n*100
]; int
dp[n][n];
int dfs(int x,int y)
intmain()
自己對於單調佇列的一點理解:
for(;lm;l++);//解析:設f[i]表示點燃當前位置烽火台,且前i個滿足要求的最小代價。優化二:同樣因為要選前m個最小的,使用單調佇列,佇列裡存有不超過m個長度單位的值,每次取隊首,進隊時維護佇列使其單調不下降,複雜度將為o(n)。佇列裡一定要有乙個元素且不合法才出隊(刪除前面)
f[i]=f[q[l]]+a[i];//
用隊首來更新當前f[i]的答案
for(;lf[i];r--);//
用當前的f[i]去更新隊尾,使佇列保持單調性(刪除後面)
q[++r]=i;//
進隊
(這裡主要講解 優化二即單調佇列)
ac**:
#include#includeusing
namespace
std;
inline
const
intread()
while(ch>='
0'&&ch<='9')
return x*f;
}const
int n=1e6+10
;int n,m,l,r,a[n],f[n],q[n<<1
];int
main()
int ans=0x7fffffff
;
for(int i=n-m+1;i<=n;i++) ans=min(ans,f[i]);
printf("%d
",ans);
return0;
}
NOIP2010初賽 烽火傳遞
烽火台又稱烽燧,是重要的軍事防禦設施,一般建在險要或交通要道上。一旦有敵情發生,白天燃燒柴草,通過濃煙表達資訊 夜晚燃燒乾柴,以火光傳遞軍情,在某兩座城市之間有 n n 個烽火台,每個烽火台發出訊號都有一定代價。為了使情報準確地傳遞,在連續 m m 個烽火台中至少要有乙個發出訊號。請計算總共最少花費...
NOIP2010普及組初賽試題錯題整理
11 乙個字長為8位的整數的補碼是11111001,則它的原碼是 d a.00000111 b.01111001 c.11111001 d.10000111 分析 二進位制中負數才有補碼,將補碼 1再按位取反,注意第一位保留1.佇列快照是指在某一時刻佇列中的元素組成的有序序列。例如,當元素1 2 3...
noip2010 關押罪犯
s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極 不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨 氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之 間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監...