【vijos1243】 生产产品
https://vijos.org/p/1243 (题目链接)
题意
一个产品的生产有m个步骤,一共n个机器人。机器人i完成步骤j的时间为T[i][j],每次当产品从一个机器人那里移动到另一个机器人那里需要时间K,每个机器人不能持续工作L个步骤。问最少能在多少时间内完成。
Solution
看起来题目变量非常多,其实想一想就能列出dp方程:${f[i][j]}$表示第${i}$个机器人完成第${j}$个步骤,一共完成前${j}$个步骤所需要的最短时间;${s[i][j]}$表示第${i}$个机器人做完前${j}$个步骤所需要的时间,那么:$${f[i][j]=min(f[k][l]+s[i][j]-s[i][l]+K)}$$
其中${k∈[1,n]}$且${k≠j}$,${l∈[j-L,j-1]}$。
但是这样的话复杂度有点高。。我们发现${n}$的范围只有5,我们可以从这里下手解决问题。如果对单独的一个机器人1号考虑,将dp方程转换一下:$${f[i][j]=min((f[1][l]-s[i][l])+s[i][j]+K)}$$
我们发现括号里的东西与j无关,可以用单调队列维护,所以我们开n个单调队列进行维护,问题就解决了。
代码
// vijos1243
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=100010;
int s[10][maxn],l[10],r[10],q[10][maxn],p[10][maxn],f[10][maxn];
int n,m,K,L; int main() {
scanf("%d%d%d%d",&m,&n,&K,&L);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++) scanf("%d",&s[i][j]),s[i][j]+=s[i][j-1];
for (int i=1;i<=n;i++) l[i]=r[i]=1,q[i][1]=0,p[i][1]=0;
for (int j=1;j<=m;j++) {
for (int i=1;i<=n;i++) {
while (l[i]<=r[i] && p[i][l[i]]<j-L) l[i]++;
f[i][j]=q[i][l[i]]+s[i][j]+K;
}
for (int i=1;i<=n;i++)
for (int k=1;k<=n;k++) if (k!=i) {
while (l[k]<=r[k] && q[k][r[k]]>=f[i][j]-s[k][j]) r[k]--;
q[k][++r[k]]=f[i][j]-s[k][j];
p[k][r[k]]=j;
}
}
int ans=inf;
for (int i=1;i<=n;i++) ans=min(ans,f[i][m]);
printf("%d",ans-K);
return 0;
}
【vijos1243】 生产产品的更多相关文章
- vijos P1243 生产产品(单调队列+DP)
P1243生产产品 描述 在经过一段时间的经营后,dd_engi的OI商店不满足于从别的供货商那里购买产 品放上货架,而要开始自己生产产品了!产品的生产需要M个步骤,每一个步骤都可以在N台机器 ...
- 刷题总结——生产产品(vijo1243)
题目: 描述 在经过一段时间的经营后,dd_engi的OI商店不满足于从别的供货商那里购买产品放上货架,而要开始自己生产产品了!产品的生产需要M个步骤,每一个步骤都可以在N台机器中的任何一台完成,但生 ...
- vijos 1243 生产产品 DP + 单调队列优化
LINK 题意:有1个产品,m个步骤编号为1~m.步骤要在n个机器人的手中生产完成.其中,第i个步骤在第j个机器人手中的生产时间给定为$T[i][j]$,切换机器人消耗cost.步骤必须按顺序,同一个 ...
- Vijos P1243 生产产品 (单调队列优化DP)
题意: 必须严格按顺序执行M个步骤来生产一个产品,每一个步骤都可以在N台机器中的任何一台完成.机器i完成第j个步骤的时间为T[i][j].把半成品从一台机器上搬到另一台机器上也需要一定的时间K.每台机 ...
- Vijos 1243 生产产品 (单调队列优化的动态规划)
题意:中文题.不说了. 注意一些地方,机器的执行过程是没有顺序的,而且每个机器可以用多次.第一次执行的机器不消耗转移时间K. 用dp[i][j]表示第i个机器完成第j个步骤的最短时间,sum[j][i ...
- 2018.10.23 vijo1243生产产品(单调队列优化dp)
传送门 这道单调队列真的有点难写啊. 方程感觉挺简单的. f[i][j]f[i][j]f[i][j]表示在第iii个车间结束前jjj次步骤的最小代价. 然后用单调队列毒瘤优化一下就行了. 代码: #i ...
- vijos 1243 生产产品
貌似两年前联赛复习的时候就看过这题 然而当时大概看看了 感觉太难 便没有去做 如今再去做的时候 发现其实也并不容易 ------------------------------------------ ...
- Java多线程系列--“基础篇”11之 生产消费者问题
概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...
- Lingo求解线性规划案例1——生产计划问题
凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 说明: Lingo版本: 某工厂明年根据合同,每个季度末 ...
随机推荐
- AASM rule of scoring sleep stages using EEG signal
Reference: AASM (2007). The AASM Manual for the Scoring of Sleep and Associated Events: Rules, Termi ...
- 记一个全局变量"冒充"局部变量引起的bug
看代码相当简单直观,觉得怎么都不会出错,可运行结果明明就是错了 - 对着vim摸着脑袋就是想不出哪里有问题,可去掉新加的代码,就又可以了. 没办法,只好祭出杀手锏:一行一行注释掉来观察... 反映问题 ...
- denounce函数:Javascript中如何应对高频触发事件
在DOM Event的世界中,以scroll.resize.mouseover等为代表的高频触发事件显得有些与众不同.通常,DOM事件只有在明确的时间点才会被触发,比如被点击,比如XMLHttpReq ...
- 绝对干货:供个人开发者赚钱免费使用的一些好的API接口
不久前,我写了一篇文章,名为<科普技术贴:个人开发者的那些赚钱方式>,讲了一些个人开发者接私活和自己做软件加广告的一些科普知识.可是做软件,需要服务器,需要后台,对于一些小的开发者,想赚点 ...
- 20160303 - 升级 Windows 10 版本 1511 后,文件夹默认打开方式为 cmd 的修复
问题描述:升级 Windows 10 版本 1511 (OS 内部版本 10586.122)后,文件夹的默认打开方式变成了cmd.双击任何一个文件夹,显示相关的提示错误信息如下: [Window Ti ...
- [poj2484]A Funny Game(对称博弈)
题目:http://poj.org/problem?id=2484 题意:n个石子围成一个圈,两个人轮流取,每次可以取一个石子或者相邻的两个石子,问先手胜还是后手胜 分析: 典型的对称博弈 如果n&g ...
- js表单提交,面向对象
一.js表单验证之后再提交 1.普通按钮onclick函数调用表单的submit()函数 <input type=button name="submit1" value=&q ...
- DBVisualizer 6.0.2配置
DBVis是一款通过JDBC连接数据库的软件,理论上,可以连接任何数据库,今天,我们以DBVisualizer6.0.2免费版为例 (一)连接MySql5 1.解压压缩包至本地某路径下 2.配置环境变 ...
- 70 sudo-用来以其他身份来执行命令
sudo命令用来以其他身份来执行命令,预设的身份为root.在/etc/sudoers中设置了可执行sudo指令的用户.若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员.用户使用sudo ...
- 一步一步教你elasticsearch在windows下的安装
首先下载最新的elasticsearch安装版本:elasticsearch下载.下载最新的elasticsearch 0.90.1版本.下载完成后.解压缩在安装目录.在cmd命令行进入安装目录,再进 ...