1096. [ZJOI2007]倉庫建設【斜率優化DP】
阿新 • • 發佈:2018-03-31
表示 倉庫 單位 符號 output while 目前 data 兩個
假設一件產品運送1個單位距離的費用是1。假設建立的倉庫容量都都是足夠大的,可以容下所有的產品。你將得到
以下數據:1:工廠i距離工廠1的距離Xi(其中X1=0);2:工廠i目前已有成品數量Pi;:3:在工廠i建立倉庫的費用
Ci;請你幫助L公司尋找一個倉庫建設的方案,使得總的費用(建造費用+運輸費用)最小。
0 5 10
5 3 100
9 6 10
Description
L公司有N個工廠,由高到底分布在一座山上。如圖所示,工廠1在山頂,工廠N在山腳。由於這座山處於高原內
陸地區(幹燥少雨),L公司一般把產品直接堆放在露天,以節省費用。突然有一天,L公司的總裁L先生接到氣象
部門的電話,被告知三天之後將有一場暴雨,於是L先生決定緊急在某些工廠建立一些倉庫以免產品被淋壞。由於
地形的不同,在不同工廠建立倉庫的費用可能是不同的。第i個工廠目前已有成品Pi件,在第i個工廠位置建立倉庫
的費用是Ci。對於沒有建立倉庫的工廠,其產品應被運往其他的倉庫進行儲藏,而由於L公司產品的對外銷售處設
置在山腳的工廠N,故產品只能往山下運(即只能運往編號更大的工廠的倉庫),當然運送產品也是需要費用的,
以下數據:1:工廠i距離工廠1的距離Xi(其中X1=0);2:工廠i目前已有成品數量Pi;:3:在工廠i建立倉庫的費用
Ci;請你幫助L公司尋找一個倉庫建設的方案,使得總的費用(建造費用+運輸費用)最小。
Input
第一行包含一個整數N,表示工廠的個數。接下來N行每行包含兩個整數Xi, Pi, Ci, 意義如題中所述。
Output
僅包含一個整數,為可以找到最優方案的費用。
Sample Input
30 5 10
9 6 10
Sample Output
32HINT
在工廠1和工廠3建立倉庫,建立費用為10+10=20,運輸費用為(9-5)*3 = 12,總費用32。如果僅在工廠3建立倉庫,建立費用為10,運輸費用為(9-0)*5+(9-5)*3=57,總費用67,不如前者優。
【數據規模】
對於100%的數據, N ≤1000000。 所有的Xi, Pi, Ci均在32位帶符號整數以內,保證中間計算結果不超過64位帶符號整數。
f[i]表示在i建設倉庫的最小花費
f[i]=f[j]+cost(j+1,i)
cost可以用後綴和搞一下
f[i]=min( f[i], f[j] + cost[j+1]-cost[i]-(sump[j+1]-sump[i])*sumx[i] +c[i] );
#include<iostream> #include<cstring> #include<cstdio> #define N (1000000+100) #define LL long long using namespace std; LL f[N],sump[N],sumx[N],x[N],p[N],c[N],cost[N],n; LL q[N],head,tail; LL K(LL j) {return -sump[j+1];} LL B(LL j) {return f[j]+cost[j+1];} LL Y(LL i,LL j) {return K(j)*sumx[i]+B(j);} bool cover(LL x1,LL x2,LL x3) { LL w1=(K(x3)-K(x1))*(B(x1)-B(x2)); LL w2=(K(x2)-K(x1))*(B(x1)-B(x3)); return w1>=w2; } int main() { scanf("%lld",&n); for (int i=1;i<=n;++i) scanf("%lld%lld%lld",&x[i],&p[i],&c[i]); for (int i=n;i>=1;--i) { sump[i]=sump[i+1]+p[i];//i到n的產品和 sumx[i]=x[n]-x[i];//i到n的距離 } for (int i=n-1;i>=0;--i) cost[i]=cost[i+1]+p[i]*sumx[i];//cost[i]表示i..n物品都運到n的總花費 head=1,tail=1; for (int i=1;i<=n;++i) { while (head<tail && Y(i,q[head])>=Y(i,q[head+1])) head++; f[i]=Y(i,q[head])-cost[i]+sump[i]*sumx[i]+c[i]; while (head<tail && cover(i,q[tail],q[tail-1])) tail--; q[++tail]=i; } printf("%lld",f[n]); }
1096. [ZJOI2007]倉庫建設【斜率優化DP】