題目:
p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。p教授有編號為1...n的n件玩具,第i件玩具經過壓縮後變成一維長度為ci.為了方便整理,p教授要求在乙個一維容器中的玩具編號是連續的。同時如果乙個一維容器中有多個玩具,那麼兩件玩具之間要加入乙個單位長度的填充物,形式地說如果將第i件玩具到第j個玩具放到乙個容器中,那麼容器的長度將為 x=j-i+sigma(ck) i<=k<=j 製作容器的費用與容器的長度有關,根據教授研究,如果容器長度為x,其製作費用為(x-l)^2.其中l是乙個常量。p教授不關心容器的數目,他可以製作出任意長度的容器,甚至超過l。但他希望費用最小.
輸入格式:
第一行輸入兩個整數n,l.接下來n行輸入ci.1<=n<=50000,1<=l,ci<=10^7
輸出格式:
輸出最小費用
輸入樣例#1: 複製
5 434214輸出樣例#1: 複製
1這道題應該可以看出來用動態規劃做。
和土地那道題相似,我們還是可以找最後乙個塊的關係。
然後我們可以得到方程:
sum代表字首和,j表示最後乙個包前面的那乙個玩具(最後乙個包沒有j)
f[i]=min(f[i],f[j]+(i-j-1-l+sum[i]-sum[j])
注意題目裡的i
然後我們開始斜率優化。
設i由j、k轉移過來(j
不要嘲諷蒟蒻的書法orz。
然後我們進行亂搞。
設推出來的那個不等式左側值為k(j,k),右側為g(i)。
我們先看隊首。
若k(q[head],q[head+1])>g(i),則q[head+1]比q[head]更優,我們讓head++,直到q[head]更優為止。
對於隊尾,若k(q[head-1],q[head]) > k(q[head],i):
①k(q[head-1],q[head]) <= g(i),則q[head-1]比q[head]優(或一樣)
②k(q[head-1],q[head]) > g(i), 此時能算出來i比q[head]要更優。
為了培養獨立思考的好習慣具體證明留給讀者才不會告訴你演草紙丟了呢orz。
這樣就可以讓tail--,直到q[tail]更優為止。
好了這題差不多結束了,上蒟蒻的**吧。
1 #include2 #include3 #include4 #include5 #include6 #include7view codeusing
namespace
std;
8#define ll long long
9const
int maxn=50010;10
intn;
11ll f[maxn],a[maxn];
12ll s[maxn],l;
13int
q[maxn],head,tail;
14double k(int i,int
j)18
intmain()
24 head=tail=1;25
for (int i=1;i<=n;++i)
31 printf("
%lld
",f[n]);
32return0;
33 }
P3195 HNOI2008 玩具裝箱TOY
題目描述 p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。p教授有編號為1 n的n件玩具,第i件玩具經過壓縮後變成一維長度為ci.為了方便整理,p教授要求在乙個一維容器中的玩具編號是連續的。同時...
P3195 HNOI2008 玩具裝箱 題解
p3195 hnoi2008 玩具裝箱 一道比較模板的斜率優化題目 先寫出轉移方程 f i 表示前 i 個已經裝箱完畢的最優解,s i 表示前 i 項 c i 1 的和,f i f j s i s j l 1 2 j i 用 l 1 代替 l 比較好處理,於是方程變成 f i f j s i s j...
P3195 HNOI2008 玩具裝箱TOY
紀念不看題解 a 掉的第乙個斜率優化dp p3195 hnoi2008 玩具裝箱toy 乙個月後補的重點 斜率優化的本質就是利用推出來的公式決定維護乙個凸包,用單調佇列來維護這個凸包,因為我們假定 jdp k 所以每次決策顯然就取隊頭,從而得到最優解 定義陣列 sum i 為長度字首和,陣列 dp ...