ZJOI2007 倉庫建設

2021-08-30 02:39:22 字數 1493 閱讀 7934

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, 意義如題中所述。

輸出僅包含乙個整數,為可以找到最優方案的費用。

0 5 10

5 3 100

9 6 10

【樣例說明】 

在工廠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位帶符號整數。 

#includeusing namespace std;

const int maxn=1000005;

typedef long long ll;

ll n,d[maxn],p[maxn],c[maxn];

ll s[maxn],sp[maxn];

#define y(x) (f[x]+s[x])

#define w(x) (c[x]+d[x]*sp[x]-s[x])

#define t(x1,x2) (1.0*(y(x1)-y(x2)))/(1.0*(sp[x1]-sp[x2]))

ll l,r,q[maxn],f[maxn];

int main()

q[l=r=1]=0;

for(int i=1;i<=n;++i)

cout<

return 0;

}

ZJOI 2007 倉庫建設

注意到我們所有的東西都只能轉移到後面,那麼可以考慮dp 用dp i 表示以i結尾建立倉庫的最小花費 那麼dp i min dp i dp j w i sigma dis i dis k num k 這個dp直接轉移是n 2 考慮優化這個dp 然後他是由前面所有的轉移過來,而且還有其他的陣列來計算答案...

ZJOI2007 倉庫建設

傳送門 考慮用dp i 表示把前i個地點的物品全部安置好的最小花費。因為物品只能往下運,所以當前這個位置必須建倉庫,dp方程很好想 dp i min p k x i x k c i 用 sum n 表示 sum np i ssum n 表示 sum np i x i 之後把式子變個型套斜率優化就好了...

ZJOI 2007 倉庫建設

這道題不算很難,這裡我提供兩種做法。設 dp i 為在 i 位上設定倉庫,前面工廠都解決了的最小花費。首先我們可以列出 dp 式 dp i min dp j sigma p k x i x k c i 即 dp i min dp j x i sigma p k sigma p k x k c i 我...