ZJOI 2007 倉庫建設

2022-05-08 04:54:11 字數 1825 閱讀 1090

這道題不算很難,這裡我提供兩種做法。

設 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]

\]我們定義 pre 陣列為 p 陣列的字首和,s 陣列為 \(p[i]*x[i]\) 的字首和。用這兩個陣列亂搞就可以用斜率優化了。

貼一下**。

#include #include using namespace std;

typedef long long ll;

const int n = 1e6 + 5;

int n, q[n], head, tail;

ll c[n], x[n], pre[n], dp[n], s[n];

int read()

return x * f;

}double slope(const int j1, const int j2)

int main()

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

ll ans = dp[n];

printf("%lld\n", ans);

return 0;

}

這裡說一下乙個疑惑。我們 dp[n] 的定義是保證 n 一定會是倉庫的最小值。但是,題目並不保證工廠 n 的材料不為 0。也就是說,我們有可能選取之前的 dp 值,保證那個座標的後面工廠都沒有材料(也就不需要設定倉庫了)。

我是這樣寫的:

ll ans = dp[n];

for(int i = n; i >= 1; -- i)

printf("%lld\n", ans);

hysbz 交上去是錯的?好懵???(我懷疑是資料有鍋或者是我想錯了)

dp 陣列,pre 陣列定義同上。這裡的 s 陣列有點不一樣,表示前面所有工廠的材料都轉移到 i 工廠的花費。則可以轉化為:

\[dp[i]=min(dp[j]+s[i]-pre[j]*(x[i]-x[j])-s[j])+c[i]

\]其中 \(s[i]-pre[j]*(x[i]-x[j])-s[j]\) 是將之前的 sigma 感性理解:i 與區間 \([j+1,i]\) 的數匹配,每個地方向 i 的花費。我們首先 \(s[i]-s[j]\),剩下的就是 [1,j] 區間到 i 的花費要減去,而 \(pre[j]*(x[i]-x[j])\) 正是區間的成品數量乘上路程。

我們設 \(f[i]=s[i]\) ,\(g[i]=pre[i]*x[i]-s[i]\),然後亂搞出斜率優化?

#include #include using namespace std;

const int n = 1e6 + 5;

int n, q[n], head, tail;

double c[n], x[n], pre[n], g[n], dp[n], s[n];

int read()

return x * f;

}double slope(const int j1, const int j2)

int main()

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

long long ans = dp[n];

for(int i = n; i >= 1; -- i)

printf("%lld\n", ans);

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