題解 P2224 HNOI2001 產品加工

2022-05-07 21:09:08 字數 1276 閱讀 4445

是道好題,卡常卡到我裂開/kk

題目鏈結

題目大意:有兩台機器,共\(n\)個任務,每個任務你可以讓第一台機器單獨做花費它\(a\)時間,可以讓第二台機器單獨做花費它\(b\)時間,可以讓兩台機器同時做都花費\(c\)時間(部分任務有特殊要求,只能某些機器做),求完成所有任務最小時間

動態規劃,奇奇怪怪的優化

分析:首先題意有個不明確的地方(也可能是我沒有讀出來),就是時間\(c\)代表兩台機器是分工做,而不是同時做,它們互不影響,也就是如果兩台機器要共同完成乙個任務,並不需要等到兩台機器都空閒了,才能一起做

然後我們發現,當前的狀態可以用乙個三元組表示出來,\((i,a,b)\)表示已經做了前\(i\)個任務,第一台機器花費\(a\)時間,第二台機器花費\(b\)時間,總時間就是\(max(a,b)\),三元組的轉移十分簡單就不在此列出

空間不允許我們開三維陣列,我們可以開二維,把\(i,a\)丟給下標表示,用陣列值來表示\(c\),因為我們要求最小值,所以只需儲存乙個\(c\)最小的三元組即可

那麼\(f[i][a]\)實際上表示已經做了前\(i\)個任務,第一台機器花費\(a\)時間的時候第二台機器最少花費的時間

轉移方程:

\[f[i][a]=min\beginf[i-1][a-t_i.a] \\ f[i-1][a]+t_i.b \\ f[i-1][a-t_i.c]+t[i].c\end

\]\(t_i\)表示第\(i\)個任務,\(t_i.a\)表示給第乙個機器做的時間(其他兩個同理),轉移條件略去qaq(主要是懶得打)

這個樸素\(dp\)是跑不過去的,需要億點點優化

附上不開o2可以勉強卡過的**:

#include #include #include using namespace std;

const int maxn = 6033,maxm = 33333;

inline int read()

inline int min(int a,int b)

inline int max(int a,int b)

unsigned short f[maxm];

int n,ans = 0x7fffffff,down,up;

int main()

} for(int i = down;i <= up;i++)ans = min(ans,max(i,f[i]));

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

return 0;

}

P2224 HNOI2001 產品加工

某加工廠有a b兩台機器,來加工的產品可以由其中任何一台機器完成,或者兩台機器共同完成。由於受到機器效能和產品特性的限制,不同的機器加工同一產品所需的時間會不同,若同時由兩台機器共同進行加工,所完成任務又會不同。某一天,加工廠接到n個產品加工的任務,每個任務的工作量不盡一樣。你的任務就是 已知每個任...

洛谷 P1128 HNOI2001 求正整數

題目描述 對於任意輸入的正整數n,請程式設計求出具有n個不同因子的最小正整數m。例如 n 4,則m 6,因為6有4個不同整數因子1,2,3,6 而且是最小的有4個因子的整數。輸入輸出格式 輸入格式 n 1 n 50000 輸出格式 m輸入輸出樣例 輸入樣例 1 int.in 4輸出樣例 1 int....

P3197 HNOI2008 越獄 題解

監獄有 n 個房間,每個房間關押乙個犯人,有 m 種宗教,每個犯人會信仰其中一種。如果相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生越獄。答案對 100,003 取模。輸入只有一行兩個整數,分別代表宗教數 m 和房間數 n 輸出一行乙個整數代表答案。輸入 1 2 3輸出 1 6樣例...