【bzoj 1096】[ZJOI2007]倉庫建設
阿新 • • 發佈:2017-06-24
esp pan 建設 col 意義 none sum pla 工廠
假設一件產品運送1個單位距離的費用是1。假設建立的倉庫容量都都是足夠大的,可以容下所有的產品。你將得到
以下數據:1:工廠i距離工廠1的距離Xi(其中X1=0);2:工廠i目前已有成品數量Pi;:3:在工廠i建立倉庫的費用
Ci;請你幫助L公司尋找一個倉庫建設的方案,使得總的費用(建造費用+運輸費用)最小。
【數據規模】
對於100%的數據, N ≤1000000。 所有的Xi, Pi, Ci均在32位帶符號整數以內,保證中間計算結果不超過64位帶符號整數。
Description
L公司有N個工廠,由高到底分布在一座山上。如圖所示,工廠1在山頂,工廠N在山腳。由於這座山處於高原內
陸地區(幹燥少雨),L公司一般把產品直接堆放在露天,以節省費用。突然有一天,L公司的總裁L先生接到氣象
部門的電話,被告知三天之後將有一場暴雨,於是L先生決定緊急在某些工廠建立一些倉庫以免產品被淋壞。由於
地形的不同,在不同工廠建立倉庫的費用可能是不同的。第i個工廠目前已有成品Pi件,在第i個工廠位置建立倉庫
的費用是Ci。對於沒有建立倉庫的工廠,其產品應被運往其他的倉庫進行儲藏,而由於L公司產品的對外銷售處設
置在山腳的工廠N,故產品只能往山下運(即只能運往編號更大的工廠的倉庫),當然運送產品也是需要費用的,
假設一件產品運送1個單位距離的費用是1。假設建立的倉庫容量都都是足夠大的,可以容下所有的產品。你將得到
以下數據:1:工廠i距離工廠1的距離Xi(其中X1=0);2:工廠i目前已有成品數量Pi;:3:在工廠i建立倉庫的費用
Ci;請你幫助L公司尋找一個倉庫建設的方案,使得總的費用(建造費用+運輸費用)最小。
Input
第一行包含一個整數N,表示工廠的個數。接下來N行每行包含兩個整數Xi, Pi, Ci, 意義如題中所述。
Output
僅包含一個整數,為可以找到最優方案的費用。
Sample Input
3
0 5 10
5 3 100
9 6 10
Sample Output
32
HINT
在工廠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位帶符號整數。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=1000050; 6 int n,l,r,q[N]; 7 long long f[N],x[N],p[N],c[N],num[N],sum[N]; 8 long long read() 9 { 10 longView Codelong x=0,k=1;char c=getchar(); 11 while(c<‘0‘||c>‘9‘){if(c==‘-‘)k=-1;c=getchar();} 12 while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();} 13 return x*k; 14 } 15 double slope(int k,int j){return (f[j]-f[k]+sum[j]-sum[k])/(1.0*(num[j]-num[k]));} 16 int main() 17 { 18 n=read(); 19 for(int i=1;i<=n;i++) 20 { 21 x[i]=read();p[i]=read();c[i]=read(); 22 num[i]=num[i-1]+p[i]; 23 sum[i]=sum[i-1]+p[i]*x[i]; 24 } 25 for(int i=1;i<=n;i++) 26 { 27 while(l<r&&slope(q[l],q[l+1])<x[i])l++; 28 int t=q[l]; 29 f[i]=f[t]+(num[i]-num[t])*x[i]-(sum[i]-sum[t])+c[i]; 30 while(l<r&&slope(q[r],i)<slope(q[r-1],q[r]))r--; 31 q[++r]=i; 32 } 33 printf("%lld",f[n]); 34 return 0; 35 }
【bzoj 1096】[ZJOI2007]倉庫建設