【NOIP2006T】作业调度方案

问题描述

  我们现在要利用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次处理
 
每个物品找到第一段时间足以容纳自身的区间,然后改变区间状态即可
 
有个小细节
每次放完一个物品后下一个次序要从这次的尾端之后开始
很好控制的
 
代码:

    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
 
原文地址:https://www.cnblogs.com/qswx/p/8447344.html