问题描述
我们现在要利用m台机器加工n个工件,每个工件都有m道工序,每道工序都在不同的指定的机器上完成。每个工件的每道工序都有指定的加工时间。
一方面,每个操作的安排都要满足以下的两个约束条件。
(1) 对同一个工件,每道工序必须在它前面的工序完成后才能开始;
(2) 同一时刻每一台机器至多只能加工一个工件。
另一方面,在安排后面的操作时,不能改动前面已安排的操作的工作状态。
还要注意,“安排顺序”只要求按照给定的顺序安排每个操作。不一定是各机器上的实际操作顺序。在具体实施时,有可能排在后面的某个操作比前面的某个操作先完成。约定:在保证约束条件(1)(2)的条件下,尽量靠前插入。并且,我们还约定,如果有多个空档可以插入,就在保证约束条件(1)(2)的条件下,插入到最前面的一个空档。
计算出该方案完成全部任务所需的总时间。
输入格式
第1行为两个正整数,用一个空格隔开:
m n(其中m(<20)表示机器数,n(<20)表示工件数)
第2行:M*N个用空格隔开的数,为给定的安排顺序。
接下来的2n行,每行都是用空格隔开的m个正整数,每个数不超过20。
其中前n行依次表示每个工件的每个工序所使用的机器号。
后n行依次表示每个工件的每个工序的加工时间。
可以保证,以上各数据都是正确的,不必检验。
m n(其中m(<20)表示机器数,n(<20)表示工件数)
第2行:M*N个用空格隔开的数,为给定的安排顺序。
接下来的2n行,每行都是用空格隔开的m个正整数,每个数不超过20。
其中前n行依次表示每个工件的每个工序所使用的机器号。
后n行依次表示每个工件的每个工序的加工时间。
可以保证,以上各数据都是正确的,不必检验。
输出格式
只有一个正整数,为最少的加工时间。
解题算法
【模拟】
解题思路:
顺向思维模拟即可
因为各个物品放置法则等同
所以可以用函数进行M*N次处理
每个物品找到第一段时间足以容纳自身的区间,然后改变区间状态即可
有个小细节
每次放完一个物品后下一个次序要从这次的尾端之后开始
很好控制的
代码:
int mtp=mach[id][front[id]];
int ct=tim[id][front[id]];
int sub=last[id];
while(1)
{
int flag=0;
F(i,1,ct)
flag+=vit[mtp][i+sub];
if(!flag)break;
sub++;
}
F(i,1,ct)
vit[mtp][sub+i]=1;
ans=max(ans,sub+ct);
last[id]=sub+ct;
front[id]++;
以上、
AC
模拟套路大同小异,闻一知十。
以上
2018.2.13