貌似两年前联赛复习的时候就看过这题 然而当时大概看看了 感觉太难 便没有去做

如今再去做的时候 发现其实也并不容易

-------------------------------------------------------------------------

这题首先是要处理一下不能在同一台机器上工作L个步骤

对于这一点 我们可以构造两个数组

$f[i][j]$表示在第$i$台机器上完成了第$j$个步骤

$g[i][j]$表示在第$i$台机器上完成了第$j$个步骤 且第$j-1$个步骤不是在第$i$台机器上完成的

这一个问题解决后 我们通过此题$tag$的提示 会思考一下这题有什么单调性

我们记$sum[i][j]$表示在第$i$台机器上一直工作完第$j$个步骤所耗费时间(不考虑$L$的限制)

对于$f[i][j],f[i][p](p<j)$这两个状态

很明显可以观察出 如果$f[i][p]+(sum[i][j]-sum[i][p])>f[i][j]$

那么从$p$到$j$一定通过换机器达到了更少的时间消耗

将上式移项后可将$f[i][p]-sum[i][p]$作为单调队列中元素大小

每次加入$f[i][j]-sum[i][j]$进行比较

具体实现细节比较多 可以参考代码

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define rep(i,n) for(int i=1;i<=n;++i)
#define imax(x,y) (x>y?x:y)
#define imin(x,y) (x<y?x:y)
using namespace std;
const int M=;
int sum[][M],f[][M],g[][M];
int q[][M],ifront[],itail[];
int m,n,k,l,ans=;
int main()
{
scanf("%d%d%d%d",&m,&n,&k,&l);
int x;
rep(i,n)
{
rep(j,m)
{
scanf("%d",&x);
sum[i][j]=sum[i][j-]+x;
}
}
memset(f,,sizeof(f));
memset(g,,sizeof(g));
rep(i,n)
{
f[i][]=g[i][]=sum[i][];
q[i][]=;
ifront[i]=itail[i]=;
}
for(int j=;j<=m;++j)
{
rep(i,n)
{
rep(p,)if(p!=i)
g[i][j]=imin(g[i][j],f[p][j-]+(sum[i][j]-sum[i][j-]+k));
while(itail[i]>=ifront[i]&&
g[i][q[i][itail[i]]]-sum[i][q[i][itail[i]]]>g[i][j]-sum[i][j])
--itail[i];
q[i][++itail[i]]=j;
if(q[i][ifront[i]]+l-<j)++ifront[i];
f[i][j]=imin(f[i][j],g[i][q[i][ifront[i]]]+(sum[i][j]-sum[i][q[i][ifront[i]]]));
}
}
rep(i,n)
ans=imin(ans,f[i][m]);
printf("%d",ans);
return ;
}

vijos 1243 生产产品的更多相关文章

  1. vijos 1243 生产产品 DP + 单调队列优化

    LINK 题意:有1个产品,m个步骤编号为1~m.步骤要在n个机器人的手中生产完成.其中,第i个步骤在第j个机器人手中的生产时间给定为$T[i][j]$,切换机器人消耗cost.步骤必须按顺序,同一个 ...

  2. Vijos 1243 生产产品 (单调队列优化的动态规划)

    题意:中文题.不说了. 注意一些地方,机器的执行过程是没有顺序的,而且每个机器可以用多次.第一次执行的机器不消耗转移时间K. 用dp[i][j]表示第i个机器完成第j个步骤的最短时间,sum[j][i ...

  3. vijos P1243 生产产品(单调队列+DP)

      P1243生产产品   描述 在经过一段时间的经营后,dd_engi的OI商店不满足于从别的供货商那里购买产 品放上货架,而要开始自己生产产品了!产品的生产需要M个步骤,每一个步骤都可以在N台机器 ...

  4. Vijos P1243 生产产品 (单调队列优化DP)

    题意: 必须严格按顺序执行M个步骤来生产一个产品,每一个步骤都可以在N台机器中的任何一台完成.机器i完成第j个步骤的时间为T[i][j].把半成品从一台机器上搬到另一台机器上也需要一定的时间K.每台机 ...

  5. 刷题总结——生产产品(vijo1243)

    题目: 描述 在经过一段时间的经营后,dd_engi的OI商店不满足于从别的供货商那里购买产品放上货架,而要开始自己生产产品了!产品的生产需要M个步骤,每一个步骤都可以在N台机器中的任何一台完成,但生 ...

  6. 【vijos1243】 生产产品

    https://vijos.org/p/1243 (题目链接) 题意 一个产品的生产有m个步骤,一共n个机器人.机器人i完成步骤j的时间为T[i][j],每次当产品从一个机器人那里移动到另一个机器人那 ...

  7. 2018.10.23 vijo1243生产产品(单调队列优化dp)

    传送门 这道单调队列真的有点难写啊. 方程感觉挺简单的. f[i][j]f[i][j]f[i][j]表示在第iii个车间结束前jjj次步骤的最小代价. 然后用单调队列毒瘤优化一下就行了. 代码: #i ...

  8. Java多线程系列--“基础篇”11之 生产消费者问题

    概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...

  9. Lingo求解线性规划案例1——生产计划问题

    凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 说明: Lingo版本:                            某工厂明年根据合同,每个季度末 ...

随机推荐

  1. 个人珍藏的PC和安卓应用列表

    个人珍藏的PC和安卓应用列表 PC应用名称 功能描述 注意事项 存储位置 维棠FLV视频下载软件 可用来下载腾讯视频的视频 将视频列表的网址粘贴到维棠软件左侧"下载"的地址中即可批 ...

  2. 链接层-UDP

    五大特点:无连接,不可靠,面向报文传输,没有拥塞控制,首部开销小

  3. 一波骚操作,我把 SQL 执行效率提高了 10,000,000 倍!

    作者:风过无痕-唐 http://www.cnblogs.com/tangyanbo/p/4462734.html 场景 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表: create  ...

  4. final-finally-finalize有什么区别

    一.final 1.final用于声明属性.方法和类,分别表示属性不可变,方法不可覆盖类和类不可能被继承(不可能再派生出新的子类). final属性:被final修饰的变量不可变. 1).引用不可变 ...

  5. python开发之路-day01

    1.Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为A ...

  6. Laya2.0的转变

    之前一直用Laya1.x+TypeScript了,最近项目开始使用Laya2.0+AS3了 总结一下需要注意的一些事项,算是2种开发模式的区别与过渡吧 1.AS类的访问标识 必须是public,不写会 ...

  7. 问题处理——"无法导航到插入符号下的符号"

    最近编码时经常发现"转到定义"功能没法用了,代码一片灰.刚开始时重新编译一下项目或重启一下VS就恢复了,但到后面这两种方法都不管用了. 偶然下发现解决方案中很多项目的引用都出现了黄 ...

  8. 机器学习-线性回归补充-R^

    线性回归算法在选自变量会遇到两个问题:一是去掉多重共线性干扰,二是选择最优自变量组合. 线性回归步骤 1.选择自变量 注意点 去掉多重共线性干扰,选择最优自变量组合.这里需要理解决定系数:R^.它是理 ...

  9. Nginx学习总结:geo与image模块(四

    斜体下划线,表示建议采用默认配置,无需显式的配置 一.ngx_http_geo_module 核心特性为:根据客户端IP(段),geo模块将会匹配出指定的变量(比如,国家代码,城市代码).geo模块可 ...

  10. zabbix入门之定义触发器

    zabbix入门之定义触发器 触发器的概念 触发器的定义:界定某特定的item 采集到数据的非合理区间或非合理状态.通常为逻辑表达式. 逻辑表达式(阈值):通常用于定义数据的不合理区间,其结果如下: ...