[BZOJ1222/Luogu2224][HNOI2001]产品加工
生活随笔
收集整理的這篇文章主要介紹了
[BZOJ1222/Luogu2224][HNOI2001]产品加工
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:
BZOJ1222
Luogu2224
題號不錯
這種類型的\(DP\)是第二次見了,不過第一次是剛學的時候了,現在早就忘了,思想還是很神的。
看到時間\(\le 5\)也能猜到很重要了。
設\(f_{[i],[j]}\)表示前\(i\)件物品,\(A\)機器用時\(j\)秒時\(B\)機器最短用時。
為了避免分類討論,如果\(a,b,c\)為\(0\)則改成\(+\infty\)
那么有如下轉移方程式:
\[ f_{[i],[j]}= \begin{cases} f_{[i-1],[j-a]} & (a\le j)\\ f_{[i-1],[j]}+b\\ f_{[i-1],[j-c]}+c &(c\le j) \end{cases} \]
為什么不用考慮順序?
因為對于所有空隙,一定可以通過適當的調整來拼在一起,保證答案的正確性。
這題還需要一定的毒瘤常數優化。
#include <cstdio> #include <cstring>inline int Min(int a,int b){return a<b?a:b;} inline int Max(int a,int b){return a>b?a:b;}const int Inf=0x3f3f3f3f; int n,Ans=Inf,Up; int f[30015];int main() {scanf("%d",&n);memset(f,0x3f,sizeof f),f[0]=0;for(register int a,b,c;n--;){scanf("%d%d%d",&a,&b,&c);Up+=Max(a,c);a?0:a=Inf;b?0:b=Inf;c?0:c=Inf;for(register int i=Up;i>=0;--i){b==Inf?f[i]=Inf:f[i]+=b;if(a<=i)f[i]=Min(f[i],f[i-a]);if(c<=i)f[i]=Min(f[i],f[i-c]+c);}}for(int i=0;i<=Up;++i)Ans=Min(Ans,Max(i,f[i]));printf("%d\n",Ans);return 0; }轉載于:https://www.cnblogs.com/LanrTabe/p/10184799.html
總結
以上是生活随笔為你收集整理的[BZOJ1222/Luogu2224][HNOI2001]产品加工的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java语言基础22--访问权限
- 下一篇: 网络流n题