BZOJ 1096 [ZJOI2007]倉庫建設 斜率最佳化dp

來源:互聯網
上載者:User

標籤:

1096: [ZJOI2007]倉庫建設

Time Limit: 20 Sec

Memory Limit: 256 MB

題目串連

http://www.lydsy.com/JudgeOnline/problem.php?id=1096

Description

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

Input

第一行包含一個整數N,表示工廠的個數。接下來N行每行包含兩個整數Xi, Pi, Ci, 意義如題中所述。

Output

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

Sample Input

3
0 5 10
5 3 100
9 6 10

Sample Output

32

HINT

 

題意

 

題解:

n^2的dp很顯然就推出來了

然後斜率最佳化DP就吼了……

代碼:

#include <cstdio>#include <cmath>#include <cstring>#include <ctime>#include <iostream>#include <algorithm>#include <set>#include <vector>#include <sstream>#include <queue>#include <typeinfo>#include <fstream>#include <map>#include <stack>typedef long long ll;using namespace std;//freopen("D.in","r",stdin);//freopen("D.out","w",stdout);#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)#define maxn 1000100#define mod 10007#define eps 1e-9int Num;//const int inf=0x7fffffff;   //нчоч╢Сconst int inf=0x3f3f3f3f;inline ll read(){    ll x=0,f=1;char ch=getchar();    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}    return x*f;}//**************************************************************************************ll p[maxn],s[maxn],c[maxn];ll h[maxn];ll t,w;ll f[maxn],q[maxn];int n;ll slope(int k,int j){    return double(f[j]-f[k]+h[j]-h[k])/double(p[j]-p[k]);}int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++)       scanf("%lld%lld%lld",&s[i],&p[i],&c[i]);    for(int i=1;i<=n;i++)    {        h[i]=h[i-1]+s[i]*p[i];        p[i]=p[i-1]+p[i];    }    for(int i=1;i<=n;i++)    {        while(t<w&&slope(q[t],q[t+1])<s[i])t++;        int j = q[t];        f[i]=f[j]+s[i]*(p[i]-p[j])-h[i]+h[j]+c[i];        while(t<w&&slope(q[w-1],q[w])>slope(q[w],i))w--;        q[++w]=i;    }    printf("%lld\n",f[n]);}

 

BZOJ 1096 [ZJOI2007]倉庫建設 斜率最佳化dp

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.