NOI 2008 志願者招募

2022-05-08 05:00:09 字數 1713 閱讀 9737

考慮用 $ p_i $ 表示第 $ i $ 天實際招收的人數,我們假設我們有三種志願者,分別是 $ 1\to 2,1 \to 3 , 2\to 3 $ ,我們招手的人數分別是 $ b_1,b_2,b_3 $

那麼第一天實際人數就是 $ p_1 = b_1+b_2 \geq a_1 $ ,同理我們把三個不等式寫出來:

\[b_1 + b_2 \ge a_1\\b_1 + b_2 + b_3 \ge a_2\\b_2 + b_3 \ge a_3

\]發現這是個線性規劃的模型,而且據說這題玄學線性規劃也能跑過去。。

然後考慮把 $ \ge $ 變成 $ = $ ,設 $ d_i $ 是乙個大於 $ 0 $ 的整數,並且

\[b_1 + b_2 = a_1 + d_1\\b_1 + b_2 + b_3 = a_2 + d_2\\b_2 + b_3 = a_3 + d_3

\]然後,我們發現如果第 $ i $ 種志願者可以在 $ s \to t $ 天工作,那麼 $ b_i $ 一定會出現在第 $ s $ 到 $ t $ 個等式種。我們可以考慮利用這個性質,把等式差分一下,於是 $ b_i $ 就必然在 $ s $ 個等式為正, $ t + 1 $ 個等式為負。

網路流有乙個經典東西叫流量平衡,即對於一條邊 $ x,y $ ,我們這條邊的流量在 $ x $ 的流量中作為負值,在 $ y $ 中作為正值。於是可以考慮從 $ s $ 向 $ t + 1 $ 連一條容量無窮,費用為 $ c_i $ 的邊。我們發現 $ d_i $ 可以類似做,從 $ i - 1 $ 向 $ i $ 連一條容量無窮,費用 0 的邊,表示 $ d_ $ 。

差分後的式子中還有 $ a_i - a_ $ 這個東西,如果是正的就從它向匯點連容量為 $ a_i - a_ $ 的邊,否則從原點向它連 $ a_ - a_i $ 的邊,費用為 0 。由於 $ d_i $ 可以隨便取,這個最終的網路流費用為的 0 的邊必然可以跑滿,所以我們就滿足了這些限制。最後 $ s \to t + 1 $ 的邊就是各個時段的安排的人數。

#include "iostream"

#include "algorithm"

#include "cstring"

#include "cstdio"

#include "queue"

using namespace std;

#define maxn 1009

#define inf 0x3f3f3f3f

class mincmaxf

int add(int u, int v, int w, int c)

int ade(int u, int v, int w, int c)

bool spfa(int s, int t) }}

return dis[t] != inf;

}int dfs(int u, int t, int flow)

}vis[u] = 0;

return ans;

}int mcmf(int s, int t)

return ret;

}} f ;

int n , m;

int s = 1007 , t = 1008;

int a[maxn];

int main()

for( int i = 1 , s , t , c ; i <= m ; ++ i )

cout << f.mcmf( s , t ) << endl;

}

NOI2008志願者招募

申奧成功後,布布經過不懈努力,終於成為奧組委下屬公司人力資源部門的主管。布布剛上任就遇到了乙個難題 為即將啟動的奧運新專案招募一批短期志願者。經過估算,這個專案需要n 天才能完成,其中第i 天至少需要ai 個人。布布通過了解得知,一共有m 類志願者可以招募。其中第i 類可以從第si 天工作到第ti ...

NOI2008 志願者招募

oj題號 bzoj1061 題目大意 有 n 個任務,m 個志願者,完成每個任務 i 至少需要 a i 個人,每個人只有在 s i 到 t i 的時候有空,並需要被支付 c i 的報酬,求完成所有任務的最小支出。思路 先挖空後補空 將每個時間抽象成點,並在時間軸的兩端增加源匯 s 和 t 每個相鄰的...

noi2008 志願者招募

題目大意 乙個專案需要n天才能完成,其中第i天需要ai個人,共有m類志願者可以招募,每種都有固定的工作時間和招募費用。找出一種最優的招募方案。分析 其實這題很明顯網路流,不過建圖真的很麻煩很麻煩,要用到等式轉換什麼的,我就不獻醜了,題解見 noi要是真出個讓你看出來是網路流的題,估計是沒幾個人能構出...