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 我...