題目位址——
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設 f(3 4
2 1
4
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。考慮斜率優化。原來的方程太...