l公司有n個工廠,由高到底分布在一座山上。如圖所示,工廠1在山頂,工廠n在山腳。 由於這座山處於高原內陸地區(乾燥少雨),l公司一般把產品直接堆放在露天,以節省費用。突然有一天,l公司的總裁l先生接到氣象部門的**,被告知三天之後將有一場暴雨,於是l先生決定緊急在某些工廠建立一些倉庫以免產品被淋壞。由於地形的不同,在不同工廠建立倉庫的費用可能是不同的。第i個工廠目前已有成品pi件,在第i個工廠位置建立倉庫的費用是ci。對於沒有建立倉庫的工廠,其產品應被運往其他的倉庫進行儲藏,而由於l公司產品的對外銷售處設定在山腳的工廠n,故產品只能往山下運(即只能運往編號更大的工廠的倉庫),當然運送產品也是需要費用的,假設一件產品運送1個單位距離的費用是1。假設建立的倉庫容量都都是足夠大的,可以容下所有的產品。你將得到以下資料: 工廠i距離工廠1的距離xi(其中x1=0); 工廠i目前已有成品數量pi; 在工廠i建立倉庫的費用ci; 請你幫助l公司尋找乙個倉庫建設的方案,使得總的費用(建造費用+運輸費用)最小。
第一行包含乙個整數n,表示工廠的個數。接下來n行每行包含兩個整數xi, pi, ci, 意義如題中所述。
僅包含乙個整數,為可以找到最優方案的費用。
30 5 10
5 3 100
9 6 10
32在工廠1和工廠3建立倉庫,建立費用為10+10=20,運輸費用為(9-5)*3 = 12,總費用32。如果僅在工廠3建立倉庫,建立費用為10,運輸費用為(9-0)*5+(9-5)*3=57,總費用67,不如前者優。【資料規模】對於20%的資料, n ≤500;對於40%的資料, n ≤10000;對於100%的資料, n ≤1000000。 所有的xi, pi, ci均在32位帶符號整數以內,保證中間計算結果不超過64位帶符號整數。
裸dp很水。。。但是o(n^2)承受不起這麼大的範圍,一定tle,只能採取小於o(n)的斜率優化dp,具體就是維護乙個雙向佇列,使得佇列內的點形成下凸的函式影象,這樣就能捨掉很多不必繼續迴圈dp的非最優解,具體可以參考jsoi集訓隊**《單調性優化在動態規劃中的應用》
下面是我花了將近半個小時,按照上面的**推出來的:
推完以後就可以做了,每次舍掉隊首一定不是最優解的元素,維護佇列中的斜率單調遞增(清除斜率單調遞減的部分)後再新增新的f[i],i∈[1,n]
#include #define maxn 1000500
long long int f[maxn],x[maxn],c[maxn],sum[maxn],sump[maxn],p[maxn],q[maxn];
//f[i]=在第i個工廠修倉庫時的所有最少總費用
//f[i]=min,c[i]=第i個工廠修倉庫的費用,w[i,j]=把i到j的貨物運到j的費用
//sum[i]=前i個工廠距離和
//q陣列用於模擬佇列
long long int getf(int i,int j) //求f[j]+w[i,j]
int main()
int h=0,t=1;
for(i=1;i<=n;i++)
{ //dp斜率優化,維護下凸函式
//f[j]+sum[j]-f[i]-sum[i]
//-----------------------j,證明i狀態比j狀態更好
// sump[j]-sump[i]
//隊首部分只需從最優的狀態開始就行,隊尾部分要捨掉不單調遞增的部分後再入隊
while(h
bzoj 1096 ZJOI2007 倉庫建設
time limit 10 sec memory limit 162 mb submit 3607 solved 1582 submit status discuss l公司有n個工廠,由高到底分布在一座山上。如圖所示,工廠1在山頂,工廠n在山腳。由於這座山處於高原內 陸地區 乾燥少雨 l公司一般把...
bzoj 1096 ZJOI2007 倉庫建設
l公司有n個工廠,由高到底分布在一座山上。如圖所示,工廠1在山頂,工廠n在山腳。由於這座山處於高原內陸地區 乾燥少雨 l公司一般把產品直接堆放在露天,以節省費用。突然有一天,l公司的總裁l先生接到氣象部門的 被告知三天之後將有一場暴雨,於是l先生決定緊急在某些工廠建立一些倉庫以免產品被淋壞。由於地形...
bzoj1096 ZJOI2007 倉庫建設
1a系列。用f i 表示在 i 這個點建立倉庫的,前i個工廠的貨物都能藏起來的最小費用。顯然f i c i min w j,i f j 其中 w j,i 表示把 j i 的貨物都運到 i 的費用 w j,i k j 1i p k x i x k x i k j 1ip k k j 1ip k x k...