日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

洛谷P3195 [HNOI2008]玩具装箱TOY

發(fā)布時間:2024/6/30 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷P3195 [HNOI2008]玩具装箱TOY 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目:https://www.luogu.org/problemnew/show/P3195

題目描述

P教授要去看奧運,但是他舍不下他的玩具,于是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。P教授有編號為1...N的N件玩具,第i件玩具經(jīng)過壓縮后變成一維長度為Ci.為了方便整理,P教授要求在一個一維容器中的玩具編號是連續(xù)的。同時如果一個一維容器中有多個玩具,那么兩件玩具之間要加入一個單位長度的填充物,形式地說如果將第i件玩具到第j個玩具放到一個容器中,那么容器的長度將為 x=j-i+Sigma(Ck) i<=K<=j 制作容器的費用與容器的長度有關(guān),根據(jù)教授研究,如果容器長度為x,其制作費用為(X-L)^2.其中L是一個常量。P教授不關(guān)心容器的數(shù)目,他可以制作出任意長度的容器,甚至超過L。但他希望費用最小.

輸入輸出格式

輸入格式:

?

第一行輸入兩個整數(shù)N,L.接下來N行輸入Ci.1<=N<=50000,1<=L,Ci<=10^7

?

輸出格式:

?

輸出最小費用

?

輸入輸出樣例

輸入樣例#1:?復制 5 4 3 4 2 1 4 輸出樣例#1:?復制

? ?1


解析

這道題應該可以看出來用動態(tài)規(guī)劃做。

和土地那道題相似,我們還是可以找最后一個塊的關(guān)系。

然后我們可以得到方程:

sum[]代表前綴和,j表示最后一個包前面的那一個玩具(最后一個包沒有j)

f[i]=min(f[i],f[j]+(i-j-1-L+sum[i]-sum[j])

注意題目里的i<j,而這個地方i由j轉(zhuǎn)移過來,所以j<i,注意區(qū)分。

?

然后我們開始斜率優(yōu)化。

設(shè)i由j、k轉(zhuǎn)移過來(j<k),這地方要求k要更優(yōu),則

不要嘲諷蒟蒻的書法orz。

?

然后我們進行亂搞。

設(shè)推出來的那個不等式左側(cè)值為k(j,k),右側(cè)為g(i)。

我們先看隊首。

若k(q[head],q[head+1])>g(i),則q[head+1]比q[head]更優(yōu),我們讓head++,直到q[head]更優(yōu)為止。

對于隊尾,若k(q[head-1],q[head])? >? k(q[head],i):

①k(q[head-1],q[head])? <=? g(i),則q[head-1]比q[head]優(yōu)(或一樣)

②k(q[head-1],q[head])? >? g(i), 此時能算出來i比q[head]要更優(yōu)。

為了培養(yǎng)獨立思考的好習慣具體證明留給讀者才不會告訴你演草紙丟了呢orz。

這樣就可以讓tail--,直到q[tail]更優(yōu)為止。

好了這題差不多結(jié)束了,上蒟蒻的代碼吧。

?

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

?

?

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/gjc1124646822/p/8439662.html

總結(jié)

以上是生活随笔為你收集整理的洛谷P3195 [HNOI2008]玩具装箱TOY的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。