申奧成功後,布布經過不懈努力,終於成為奧組委下屬公司人力資源部門的主管。布布剛上任就遇到了乙個難
題:為即將啟動的奧運新專案招募一批短期志願者。經過估算,這個專案需要n 天才能完成,其中第i 天至少需要
ai 個人。 布布通過了解得知,一共有m 類志願者可以招募。其中第i 類可以從第si 天工作到第ti 天,招募費用
是每人ci 元。新官上任三把火,為了出色地完成自己的工作,布布希望用盡量少的費用招募足夠的志願者,但這
並不是他的特長!於是布布找到了你,希望你幫他設計一種最優的招募方案。
第一行包含兩個整數n, m,表示完成專案的天數和可以招募的志願者的種類。 接下來的一行中包含n 個非負
整數,表示每天至少需要的志願者人數。 接下來的m 行中每行包含三個整數si, ti, ci,含義如上文所述。為了
方便起見,我們可以認為每類志願者的數量都是無限多的。
僅包含乙個整數,表示你所設計的最優方案的總費用。
3 32 3 4
1 2 2
2 3 5
3 3 2
141 ≤ n ≤ 1000,1 ≤ m ≤ 10000,題目中其他所涉及的資料均 不超過2^31-1。
題目中的式子有點多,我們把它們都寫出來:
令第$i$天的總志願者人數為$p_i$,第$j$種志願者招募人數為$k_j$,那麼有
$$p_i = p_ + \sum_k_j - \sum_k_j \geq a_i$$
$p_i \geq a_i$不太好處理,我們把它寫成
$$p_i = a_i + b_i (b_i \geq 0)$$
那麼我們就有
$$p_i - p_ = \sum_k_j - \sum_k_j = a_i + b_i - a_ - b_$$
即$$\sum_k_j + b_ + a_ = \sum_k_j + b_i + a_i$$
我們發現,每個志願者所代表的$k_j$只在$s_j$和$t_j+1$兩個式子裡出現,而且一左一右,每天的鬆弛變數$b_i$也只在$i$和$i+1$出現,且一左一右。
而且這個式子很像網路流中的流量平衡:
$$out_i = in_i$$
其中$in_i, out_i$分別是某個點的流入和流出。
這裡,$$in_i = \sum_k_j + b_i + a_i$$
$$out_i = \sum_k_i + b_ + a_$$
由於$a_i,a_$是必須滿足的,所以我們將其視為i與s,t之間的邊容量,而且乙個點既從s流入又向t流出沒有意義,我們只需保留容量較大的邊,容量為$|a_i-a_|$。
那麼,現在有$n+3$個點,即源點,匯點,第一天到第$n+1$天的點(若沒有第$n+1$天,那麼某些$k_j$不會出現兩次),邊有三種:
1.$k_j$對應的邊,由$s_j$連向$t_j+1$,單位代價$c_j$,容量$\infty$。
2.$b_i$對應的邊,由$i+1$連向$i$,單位代價$0$,容量$\infty$。
3.$a_i-a_$對應的邊,由$s$連向$i$或由$i$連向$t$,單位代價$0$,容量$|a_i-a_|$。
最後求一遍最小費用最大流,則每條種類為1的邊流量即為此種志願者招募個數,種類為2的邊流量即為該天比要求多多少,種類為3的邊均滿流(否則無解)。
輸出費用即可。
附**:
#include #include #include using std::queue;typedef long long ll;
const ll inf = 10000000000000000;
const int n = 1050;
const int m = 100050;
struct mcmf
inline void addedge(int u, int v, ll w, ll c)
bool spfa(int s, int t) }}
}return dis[t] < inf;
} ll solve(int s, int t)
}return ans;
}};mcmf solver;
int a[n];
int main()
for (int i = 1; i <= n + 1; ++i)
printf("%lld\n", solver.solve(s, t));
return 0;
}
bzoj1061 Noi2008 志願者招募
跟上一道基本相同,可以單純形法解線性規劃,也可以費用流.寫費用流的話建圖就是一般的線性規劃轉費用流的套路,加上基變數,然後化成等式,每個下式減上式之後可以化成表示流量平衡的等式,然後根據等式建圖就好了,跑乙個最小費用最大流.寫單純形沒有寫網路流好理解,單純形的話因為這是最小化費用的,首先要轉化成對偶...
BZOJ1061 NOI2008 志願者招募
bzoj 我們設每類志願者分別招募了b i b i 個 那麼,我們可以得到一系列的方程 s i x t i b i a x s i x t i b i a x 一共n n 天,所以是 n role presentation n n個方程 因為有不等式讓我們很不爽,所以換成等式。這裡,設y i y i...
bzoj 1061 Noi2008 志願者招募
題目大意 專案需要n 天才能完成,其中第i 天至少需要ai 個人。布布通過了解得知,一共有m 類志願者可以招募。其中第i 類可以從第si 天工作到第ti 天,招募費用是每人ci 元。新官上任三把火,為了出色地完成自己的工作,布布希望用盡量少的費用招募足夠的志願者 題解 include include...