1096 ZJOI2007 倉庫建設

2022-05-12 09:39:47 字數 2480 閱讀 6625

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公司尋找乙個倉庫建設的方案,使得總的費用(建造費用+運輸費用)最小。

第一行包含乙個整數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,不如前者優。

【資料規模】

對於100%的資料, n ≤1000000。 所有的xi, pi, ci均在32位帶符號整數以內,保證中間計算結果不超過64位帶符號整數。 

這道題首先可以有乙個基本思路,

f[i][j]表示i到j的最小花費,

f[i][j]=min(f[i][k]+k到j的花費)

這樣是n^3考慮優化。。。

顯然我們只需要用f[i]表示i到1的最小花費

f[i]=min(f[j]+i到j的花費)

這樣就變成了n^2

還是不可以,這個時候我們思考一下如何計算i到j的花費

我們可以用sum表示1到i的貨物數之和

如果直接乘距離的話會多算,所以我們b來表示第i個倉庫到1的花費,

我們用(sum[i-1]-sum[j])*x[i]-(b[i-1]-b[j])+c[i]即可。。。

然後我們發現n^2還是不行,

我們再來看現在的狀態轉移方程:f[i]=min(f[j]+(sum[i-1]-sum[j])*x[i]-(b[i-1]-b[j])+c[i])

變形得到:(f[i]-f[j]+b[i-1]-b[j])/(sum[i-1]-sum[j])=x[i]  c[i]看做常數。。。

這樣就變成了斜率優化。。。

若j比k更優

則 (f[j]-f[k]+b[j]-b[k])/(sum[j]-sum[k])所以就可做了。。。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include

8 #include9 #include10 #include11 #include

12#define inf 1000000000

13#define maxn 1000000+5

14#define maxm 10000+5

15#define eps 1e-10

16#define ll long long

17#define for0(i,n) for(int i=0;i<=(n);i++)

18#define for1(i,n) for(int i=1;i<=(n);i++)

19#define for2(i,x,y) for(int i=(x);i<=(y);i++)

20#define for3(i,x,y) for(int i=(x);i>=(y);i--)

21#define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)

22using

namespace

std;

23int

n,q[maxn];

24ll x[maxn],c[maxn],p[maxn],sum[maxn],b[maxn],f[maxn];

25int

read()

28while(ch>='

0'&&ch<='9')

29return x*f;30}

31double k(int j,int

k)34

intmain()

43int l=0,r=0;44

for1(i,n)

51 printf("

%lld

",f[n]);

52return0;

53 }

view code

1096 ZJOI2007 倉庫建設

description l公司有n個工廠,由高到底分布在一座山上。如圖所示,工廠1在山頂,工廠n在山腳。由於這座山處於高原內 陸地區 乾燥少雨 l公司一般把產品直接堆放在露天,以節省費用。突然有一天,l公司的總裁l先生接到氣象 部門的 被告知三天之後將有一場暴雨,於是l先生決定緊急在某些工廠建立一些...

1096 ZJOI2007 倉庫建設

time limit 10 sec memory limit 128 mb submit 6188 solved 2800 submit status discuss l公司有n個工廠,由高到底分布在一座山上。如圖所示,工廠1在山頂,工廠n在山腳。由於這座山處於高原內 陸地區 乾燥少雨 l公司一般把...

bzoj 1096 ZJOI2007 倉庫建設

time limit 10 sec memory limit 162 mb submit 3607 solved 1582 submit status discuss l公司有n個工廠,由高到底分布在一座山上。如圖所示,工廠1在山頂,工廠n在山腳。由於這座山處於高原內 陸地區 乾燥少雨 l公司一般把...