一本通1611倉庫建設

2022-05-08 01:57:07 字數 4081 閱讀 2979

時間限制: 1000 ms         記憶體限制: 524288 kb

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,不如前者優。

「資料規模」

對於20%的資料, n ≤500;

對於40%的資料, n ≤10000;

對於100%的資料, n ≤1000000。

所有的xi, pi, ci均在32位帶符號整數以內,保證中間計算結果不超過64位帶符號整數。

sol:這題對於我來說並不能一下子寫出正解,要先寫暴力然後推出正解

另 f[i]=f[j]+calc(j+1,i),calc(j+1,i)表示 j+1 到 i 的貨物全部運到 i 的花費

對於這個暴力統計是這樣的:

for(k=j+1;k<=i;k++)

設乙個 val[i]=val[i-1]+p[i]*dis[i];  和乙個p_qzh[i]=p_qzh[i-1]+p[i];

ss就是calc(j+1,i),容易發現ss=dis[i]*(p_qzh[i]-p_qzh[j])-(val[i]-val[j]);

然後就有了n2的暴力

然後套路的用斜率優化,過程如下

jdp[j]+cost[i]+dis[i]*(p_qzh[i]-p_qzh[j])-(val[i]-val[j]) (1)

--->dp[j]+cost[i]+dis[i]*p_qzh[i]-dis[i]*p_qzh[j]-val[i]+val[j]

dp[k]+cost[i]+dis[i]*(p_qzh[i]-p_qzh[k])-(val[i]-val[k]) (2)

--->dp[k]+cost[i]+dis[i]*p_qzh[i]-dis[i]*p_qzh[k]-val[i]+val[k]

若(1)>=(2)

---> dp[k]-dis[i]*p_qzh[k]+val[k] <= dp[j]-dis[i]*p_qzh[j]+val[j]

---> (dp[k]+val[k])-(dp[j]+val[j]) <= dis[i]*(p_qzh[k]-p_qzh[j])

上**

#include using

namespace

std;

typedef

long

long

ll;inline ll read()

while

(isdigit(ch))

return (f)?(-s):(s);

}#define r(x) x=read()inline

void

write(ll x)

if(x<10

)

write(x/10

); putchar((x%10)+'0'

);

return;}

#define w(x) write(x),putchar(' ')

#define wl(x) write(x),putchar('\n')

const

int n=1000005

;int

n,m;

ll dis[n],p[n],p_qzh[n],val[n],cost[n];

ll dp[n];

intmain()

/*for(k=j+1;k<=i;k++)

ss=dis[i]*(p_qzh[i]-p_qzh[j])-(val[i]-val[j])

*/memset(dp,

63,sizeof dp); dp[0]=0

;

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

}wl(dp[n]);

return0;

}/*input

30 5 10

5 3 100

9 6 10

output

32*/

n^2暴力

/*

jdp[j]+cost[i]+dis[i]*p_qzh[i]-dis[i]*p_qzh[j]-val[i]+val[j]

dp[k]+cost[i]+dis[i]*(p_qzh[i]-p_qzh[k])-(val[i]-val[k]) (2)

--->dp[k]+cost[i]+dis[i]*p_qzh[i]-dis[i]*p_qzh[k]-val[i]+val[k]

若(1)>=(2)

---> dp[k]-dis[i]*p_qzh[k]+val[k] <= dp[j]-dis[i]*p_qzh[j]+val[j]

---> (dp[k]+val[k])-(dp[j]+val[j]) <= dis[i]*(p_qzh[k]-p_qzh[j])

*/#include

using

namespace

std;

typedef

long

long

ll;inline ll read()

while

(isdigit(ch))

return (f)?(-s):(s);

}#define r(x) x=read()inline

void

write(ll x)

if(x<10

)

write(x/10

); putchar((x%10)+'0'

);

return;}

#define w(x) write(x),putchar(' ')

#define wl(x) write(x),putchar('\n')

const

int n=1000005

;int

n,m;

ll dis[n],p[n],p_qzh[n],val[n],cost[n];

ll dp[n],que[n];

inline

bool panduan(int j,int k,int i) //

jinline

bool panduan_rev(int j,int k,int i) //

jint

main()

int head=1,tail=1; que[1]=0

; dp[

0]=0

;

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

wl(dp[n]);

return0;

}/*input

30 5 10

5 3 100

9 6 10

output

32*/

斜率優化

佇列(一本通)

這道題重點是關係的轉換和初始化 include include include includeusing namespace std int a 101 記錄接著的的那個節點 int n,m int main int ans void bfs int x,int y int main cout in...

情感修煉一本通

實踐準則 經驗親密關係構成要素 了解 關心 相互依賴性 相互一致性 信任以及承諾 親密的伴侶彼此間有著廣泛而私密的了解。他們熟知彼此的經歷 愛好 情感和心願,而且一般不會把這些資訊透露給其他人。親密的伴侶關心對方,彼此能從對方身上感受到更多的關愛。如果人們認為自己的伴侶了解 理解並欣賞自己,其親密程...

一本通 確定進製

注意一些細節問題就可以了。1 餘數必定小於進製數 2 注意判斷數字範圍 1 p,q,r 1000000 開始以為p q會很大,但是實際 p q 1000000 因為p q r 10000000 所以,本身沒有必要使用高精度,但是如果本題目使用高精度來計算。則需要運用大整數的相關技巧來解決這個問題了。...