玩具裝箱 Codevs 1319 O N

2021-07-14 04:25:49 字數 1695 閱讀 9463

題目位址——

p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。

他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。

p教授有編號為

1...

n 的

n 件玩具,第

i件玩具經過壓縮後變成一維長度為 ci

. 為了方便整理,p教授要求在乙個一維容器中的玩具編號是連續的。

同時如果乙個一維容器中有多個玩具,那麼兩件玩具之間要加入乙個單位長度的填充物,形式地說如果將第

i 件玩具到第

j個玩具放到乙個容器中,那麼容器的長度將為 x=

j−i+

∑jk=

ick

製作容器的費用與容器的長度有關,根據教授研究,如果容器長度為

x ,其製作費用為 (x

−l)2

. 其中

l 是乙個常量。

p教授不關心容器的數目,他可以製作出任意長度的容器,甚至超過 l。

但他希望費用最小.

第一行輸入兩個整數

n ,l.

接下來

n 行輸入 ci

. 1<=

n<=

50000

,1<=l,

ci<=107

輸出最小費用

5 4

3 4

2 1

4

設 f(

x)表示前

x 個玩具的最小費用。 f(

x)=m

inx−

1i=1

其中w[i

,j]=

(j−i

+∑k=

1jc[

k]−l

)2化簡,得到斜率方程: (2

i−2+

2a(i

)−2l

)⋅[a

(k)+

k−(a

(j)+

j)]>f(

k)+(

a(k)

+k)2

−[f(

j)+(

a(j)

+j)2

] 其中,a(x

)=∑i

=1xc

i

#include 

#include

#define min(x,y) ((x)<(y)?(x):(y))

#define ll long long

using

namespace

std;

ll n,l;

ll c[50010],a[50010];

ll f[50010],y[50010],m[50010],num[50010];

double ks[50010];

ll max_right,lastcost;

const ll oo=9223372036854775807ll;

int main()

ks[0]=-oo;ks[max_right+1]=oo;

for(int i=1;i<=n;i++)

break;}}

printf("%lld\n",f[n]);

return

0;}

題解 玩具裝箱

question text 首先有乙個基礎 dp 設 dp i 表示前 i 個物品裝完的最小價值,sum i 是 c 的字首和則 dp i min 對應到本題當中即可。更新佇列的時候,如果當前隊頭的斜率小於當前 i 對應直線的斜率,則捨棄 找到的第乙個就是我們要找的點。加入 i 的時候,判斷隊尾是不...

斜率優化DP 玩具裝箱

hnoi2008 玩具裝箱toy time limit 1000ms memory limit 165536k total submit 5 accepted 5 description p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意...

BZOJ 1010 玩具裝箱

預處理字首和su mi j 1i ai,為區間求和作準備。這顯然是dp。設f i 表示前 i 件玩具花的最小費用。則有 邊界條件 f0 0 動態轉移方程 fi min fj i j 1 s umi sumj l 2 答案 fn 直接求解,時間複雜度為o n2 顯然會tle。考慮斜率優化。原來的方程太...