ZJOI2007 倉庫建設

2022-05-26 20:48:12 字數 1940 閱讀 3460

題目鏈結

l公司有n個工廠,由高到底分布在一座山上。

工廠1在山頂,工廠n在山腳。 由於這座山處於高原內陸地區(乾燥少雨),l公司一般把產品直接堆放在露天,以節省費用。

突然有一天,l公司的總裁l先生接到氣象部門的**,被告知三天之後將有一場暴雨,於是l先生決定緊急在某些工廠建立一些倉庫以免產品被淋壞。

由於地形的不同,在不同工廠建立倉庫的費用可能是不同的。第i個工廠目前已有成品pi件,在第i個工廠位置建立倉庫的費用是ci。

對於沒有建立倉庫的工廠,其產品應被運往其他的倉庫進行儲藏,而由於l公司產品的對外銷售處設定在山腳的工廠n,故產品只能往山下運(即只能運往編號更大的工廠的倉庫),當然運送產品也是需要費用的,假設一件產品運送1個單位距離的費用是1。

假設建立的倉庫容量都都是足夠大的,可以容下所有的產品。你將得到以下資料:

輸入格式:

第一行包含乙個整數n,表示工廠的個數。接下來n行每行包含兩個整數xi, pi, ci, 意義如題中所述。

輸出格式:

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

輸入樣例#1:

3

0 5 10

5 3 100

9 6 10

輸出樣例#1:
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位帶符號整數。

先暫且不看資料的範圍,只考慮如何解決題目,很容易可以想到o(n^2)的dp。

dp[i]表示在i這個工廠建立倉庫,從工廠1到工廠i所需要的最小費用。

dp的轉移方程為\(dp[i]=c[i]+min(dp[j]+\sum_^(p[k]*(x[i]-x[k])))\)

化簡後轉移方程為\(dp[i]=c[i]+min(dp[j]+x[i]*\sum_^p[k]-\sum_^(p[k]*x[k]))\)

但是n的取值範圍為1000000,所以n^2的時間複雜度肯定是過不了的,所以這裡用斜率優化,把求min的複雜度降低。

因為\(\sum_^p[k]\)和\(\sum_^(p[k]*x[k])\)中p和x是輸入的資訊,可以用字首和快速求出。

所以我們設s[i]=\(\sum_^p[k]\),ss[i]=\(\sum_^(p[k]*x[k])\)。

所以轉移方程變成了\(dp[i]=c[i]+min(dp[j]+x[i]*(s[i]-s[j])-(ss[i]-ss[j]))\)

我們取\(j\),\(k\)滿足 \(k且\(j\)比\(k\)更優,那麼有如下不等式:

\(c[i]+dp[j]+x[i]*(s[i]-s[j])-(ss[i]-ss[j])

化簡後得到\(\frac

看到\(\frac\)有沒有想到斜率呢?(\(\frac\))

有了這個不等式後我們就可以利用斜率優化了。

因為斜率要小於x[i]所以我們可以用下凸殼來維護。

沒有學習過凸包的同學請先去學習凸包。

上**:

#includeusing namespace std;

int n;

long long x[1000009],p[1000009],c[1000009];

long long a[1000009],b[1000009],pp[2000009];

long long dp[1000009],l=1,r=1;

double js(int j,int k)

int main()

printf("%lld",dp[n]);

return 0;

}

ZJOI2007 倉庫建設

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

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 之後把式子變個型套斜率優化就好了...