洛谷P3195 [HNOI2008]玩具装箱TOY
題目:https://www.luogu.org/problemnew/show/P3195
題目描述
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 4 3 4 2 1 4 輸出樣例#1:?復制? ?1
解析
這道題應該可以看出來用動態規劃做。
和土地那道題相似,我們還是可以找最后一個塊的關系。
然后我們可以得到方程:
sum[]代表前綴和,j表示最后一個包前面的那一個玩具(最后一個包沒有j)
f[i]=min(f[i],f[j]+(i-j-1-L+sum[i]-sum[j])
注意題目里的i<j,而這個地方i由j轉移過來,所以j<i,注意區分。
?
然后我們開始斜率優化。
設i由j、k轉移過來(j<k),這地方要求k要更優,則
不要嘲諷蒟蒻的書法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 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 #define ll long long 9 const int maxn=50010; 10 int n; 11 ll f[maxn],a[maxn]; 12 ll s[maxn],l; 13 int q[maxn],head,tail; 14 double k(int i,int j){ 15 return ((double)(f[i]-f[j]+(i+s[i])*(i+s[i])-(j+s[j])*(j+s[j])) 16 /(double)(2.0*(i+s[i]-j-s[j]))); 17 } 18 int main(){ 19 scanf("%d%lld",&n,&l); 20 for (int i=1;i<=n;++i){ 21 scanf("%lld",&a[i]); 22 s[i]=s[i-1]+a[i]; 23 } 24 head=tail=1; 25 for (int i=1;i<=n;++i){ 26 while (head<tail&&k(q[head],q[head+1])<=(double)(i-1-l+s[i])) head++; 27 f[i]=f[q[head]]+(i-q[head]-1-l+s[i]-s[q[head]])*(i-q[head]-1-l+s[i]-s[q[head]]); 28 while (head<tail&&k(q[tail-1],q[tail])>k(q[tail],i)) tail--; 29 q[++tail]=i; 30 } 31 printf("%lld",f[n]); 32 return 0; 33 } View Code?
?
?
?
?
轉載于:https://www.cnblogs.com/gjc1124646822/p/8439662.html
總結
以上是生活随笔為你收集整理的洛谷P3195 [HNOI2008]玩具装箱TOY的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你对一个程序员有多尊重
- 下一篇: 【easy】257. Binary Tr