zoukankan      html  css  js  c++  java
  • 【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
     
  • 相关阅读:
    P1131 [ZJOI2007]时态同步(树形dp)
    P2831 愤怒的小鸟(状压dp)
    bzoj2456 / P2397 yyy loves Maths VI (mode)
    P1879 [USACO06NOV]玉米田Corn Fields(状压dp)
    P1026 统计单词个数
    P2679 子串
    数据库合并工具 esql
    在游戏中实现语音聊天和语音转化成文字
    在游戏中实现语音聊天和语音转化成文字
    类型强转的那些坑
  • 原文地址:https://www.cnblogs.com/qswx/p/8447344.html
Copyright © 2011-2022 走看看