【DP】【P2224】】【HNOI2001】产品加工
传送门\
Description
某加工厂有\(A\)、\(B\)两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成。由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时由两台机器共同进行加工,所完成任务又会不同。某一天,加工厂接到n个产品加工的任务,每个任务的工作量不尽一样。
你的任务就是:已知每个任务在\(A\)机器上加工所需的时间\(t_1\),\(B\)机器上加工所需的时间\(t_2\)及由两台机器共同加工所需的时间\(t_3\),请你合理安排任务的调度顺序,使完成所有\(n\)个任务的总时间最少。
Input
第\(1\)行为\(n\)。\(n\)是任务总数
第\(i+1\)行为\(3\)个\([0,5]\)之间的非负整数\(t_1,t_2,t_3\),分别表示第\(i\)个任务在\(A\)机器上加工、\(B\)机器上加工、两台机器共同加工所需要的时间。如果所给的时间\(t_1\)或\(t_2\)为\(0\)表示任务不能在该台机器上加工,如果\(t_3\)为\(0\)表示任务不能同时由两台机器加工。
Output
最少完成时间
Sample Input
5
2 1 0
0 5 0
2 4 1
0 0 3
2 1 1
Sample Output
9
Hint
\(1~\leq~n~\leq~6000\)
Solution
看过去这确实是个DP,但是状态难以设计。因为共有两个时间,无法将他们体现到一个最优值上去。但是考虑最大的用时是3e4,所以其中一个用时是可以枚举的,所以可以把用时放到状态中:由此可以设计出状态:
设\(f_{i,j}\)为前i个任务,\(A\)机器花费\(j\)时间的\(B\)最小花费时间。方程显然:
\(f_{i,j}=min\){\(f_{i-1,j-a},f_{i-1,j}+b,f_{i-1,j-c}+c\)}
这样卡一卡常就过了(
Code
#include<cstdio>
#define rg register
#define ci const int
#define cl const long long int
typedef long long int ll;
namespace IO {
char buf[90];
}
template<typename T>
inline void qr(T &x) {
char ch=getchar(),lst=' ';
while(ch>'9'||ch<'0') lst=ch,ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
if(lst=='-') x=-x;
}
template<typename T>
inline void write(T x,const char aft,const bool pt) {
if(x<0) x=-x,putchar('-');
int top=0;
do {
IO::buf[++top]=x%10+'0';
x/=10;
} while(x);
while(top) putchar(IO::buf[top--]);
if(pt) putchar(aft);
}
template<typename T>
inline T mmax(const T a,const T b) {return a>b?a:b;}
template<typename T>
inline T mmin(const T a,const T b) {return a<b?a:b;}
template<typename T>
inline T mabs(const T a) {return a<0?-a:a;}
template<typename T>
inline void mswap(T &a,T &b) {
T temp=a;a=b;b=temp;
}
const int maxn = 6010;
const int maxm = 30010;
int frog[maxm];
int main() {
rg int n=0;qr(n);
rg int a,b,c;
for(rg int i=1;i<=n;++i) {
a=b=c=0;qr(a);qr(b);qr(c);
if(!a) a=maxm;if(!b) b=maxm;if(!c) c=maxm;
for(rg int j=30000;~j;--j) {
frog[j]+=b;
if(j >= a) frog[j]=mmin(frog[j],frog[j-a]);
if(j >= c) frog[j]=mmin(frog[j],frog[j-c]+c);
}
}
rg int ans=0x3f3f3f3f;
for(rg int i=0;i<30001;++i) {
ans=mmin(ans,mmax(frog[i],i));
}
write(ans,'\n',true);
return 0;
}
Summary
当一个状态的最优值包括\(n\)个参数时,可以将\(n-1\)个参数放到状态中,每次转移为其他参数为该状态时,剩下参数的最值。最后枚举参数求得答案。
【DP】【P2224】】【HNOI2001】产品加工的更多相关文章
- 洛谷 P2224 [HNOI2001]产品加工 解题报告
P2224 [HNOI2001]产品加工 题目描述 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需 ...
- 洛谷P2224 [HNOI2001] 产品加工 [DP补完计划,背包]
题目传送门 产品加工 题目描述 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时 ...
- bzoj 1222: [HNOI2001]产品加工 dp
1222: [HNOI2001]产品加工 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 381 Solved: 218[Submit][Status ...
- 【BZOJ1222】[HNOI2001]产品加工 DP
[BZOJ1222][HNOI2001]产品加工 Description 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同 ...
- Bzoj 1222: [HNOI2001]产品加工 动态规划
1222: [HNOI2001]产品加工 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 486 Solved: 298[Submit][Status ...
- BZOJ1222[HNOI2001]产品加工——DP
题目描述 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时由两台机器共同进行加工 ...
- 【bzoj1222】[HNOI2001]产品加工 背包dp
题目描述 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时由两台机器共同进行加工 ...
- 【BZOJ 1222】 [HNOI2001] 产品加工(DP)
Description 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时由两台机 ...
- BZOJ1222: [HNOI2001]产品加工(诡异背包dp)
Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 907 Solved: 587[Submit][Status][Discuss] Descriptio ...
- bzoj1222: [HNOI2001]产品加工--DP
DP神题orz dp[i]表示机器1工作i小时,机器2工作dp[i]小时 那么对于每个任务: 选1:dp[i]=dp[i-a]; 选2:dp[i]=dp[i]+b; 选1+2:dp[i]=dp[i-c ...
随机推荐
- 微信小程序之注释出现的问题(.json不能注释)
js的注释一般是双斜杠// 或者是/**/这样的快注释 .json是配置文件,其内容必须符合json格式内部不允许有注释. JSON有两种数据结构: 名称/值对的集合:key : value样式: 值 ...
- Sharepoint 2013与Sharepoint 2016的功能对比
开发人员功能 SharePoint Foundation 2013 SharePoint Server 2013 Standard CAL SharePoint Server 2013 Enterpr ...
- 五:ResourceManager High Availability RM 高可用
RM有单点失败的风险,但是可以做HA. RMs HA通过master/standby这种结构实现,一个master是active的,其它standby是inactive的.可能通过命令行切换主备节点 ...
- codeforces 269C Flawed Flow(网络流)
Emuskald considers himself a master of flow algorithms. Now he has completed his most ingenious prog ...
- 软工实践-Alpha 冲刺 (1/10)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 学习了UI设计软件的使用,了解了项目开发的具体流程. 展示 ...
- 【log4net】- 非常完善的Log4net详细说明
1.概述 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是介绍如何在Visual S ...
- Swoole和Swoft的那些事 (Http/Rpc服务篇)
https://www.jianshu.com/p/4c0f625d5e11 Swoft在PHPer圈中是一个门槛较高的Web框架,不仅仅由于框架本身带来了很多新概念和前沿的设计,还在于Swoft是一 ...
- C#中的is和as操作符
在C#语言中进行类型转换的操作符is和as.is和as都是强制类型转换,但这两者有什么相同之处和不同之处呢?在使用is和as需要注意哪些事项?下面我们从简单的代码示例去探讨这个简单的问题.注:此博文只 ...
- MapperScannerConfigurer的原理
原文地址:http://www.mybatis.org/spring/zh/mappers.html#MapperScannerConfigurer 为了代替手工使用 SqlSessionDaoSup ...
- oracle的SQL语句中的(+)是干什么用的?
Oracle中的(+) 是外连接,如果在等号的左边就是左连接 和如果在等号的右边就是右连接 和left join ,right join 比较相似.....where sn (+) ='5620030 ...