2 条题解

  • 0
    @ 2025-10-2 15:18:40
    //0.输入
    //1.按照给定安排顺序,找到一个需要插入的工件
    //2.找到这个工件,当前需要插入的工序
    //3.找到这个工序需要插在哪个机器上
    //4.找到这个工序需要花费的时间
    //5.找到这个工序,当前能开始的最早的时间
    //6.在当前机器上,以最早的时间为起点,从左往右扫,找到一个能放这个工序的空位。
    //7.将这个工序放到空位上
    //8.将这段时间,标记为在工作
    #include<cstdio>
    #include<iostream>
    using namespace std;
    int i,j,k,m,n,ans;
    int a[405]; //安排顺序 
    int mord[21][21],t[21][21];
    int cnt[21],last_[21]; //last_ 每个工件最晚时间 
    bool rec[21][8001]; //每台机器的每个时间是否被占用 
    int main()
    {
        scanf("%d%d",&m,&n);
        for (i=1; i<=m*n; i++)
            scanf("%d",&a[i]);
        for (i=1; i<=n; i++)
            for (j=1; j<=m; j++)
                scanf("%d",&mord[i][j]);
        for (i=1; i<=n; i++)
            for (j=1; j<=m; j++)
                scanf("%d",&t[i][j]);
        for (i=1; i<=m*n; i++) {
            cnt[a[i]]++;
            int tmp1=a[i],tmp2=cnt[tmp1]; //tmp1:工件 tmp2:工序
            int tmpm=mord[tmp1][tmp2]; //机器号 //t[tmp1][tmp2]
            for (j=last_[tmp1];;j++) {
                bool flag = 1;
                for (k=j+1; k<=j+t[tmp1][tmp2]; k++)
                    if (rec[tmpm][k]) { 
                        flag = 0;
                        break;
                    }
                if (flag) {
                    for (k=j+1; k<=j+t[tmp1][tmp2]; k++)
                        rec[tmpm][k] = 1; //扔入空档
                    last_[tmp1] = max(last_[tmp1],j+t[tmp1][tmp2]);
                    ans = max(ans,last_[tmp1]); //将新覆盖的结束点更新 
                    //printf("%d : %d %d\n",i,j+1,j+t[tmp1][tmp2]);
                    break;
                }
            }
        }
        printf("%d",ans);
        return 0;
    }
    
    • -2
      @ 2025-12-14 9:50:05
      题目通俗解读
      核心任务:用m台机器加工n个工件,每个工件要按顺序完成m道工序,每道工序在指定机器上加工。按给定的操作顺序(工件号序列),在满足规则的前提下安排所有工序,计算总加工时间。
      
      关键规则解析
      两大约束:
      
      工序顺序:同一工件的工序必须按1→2→…→m的顺序完成,例如工件1的工序2必须在工序1结束后才能开始。
      机器独占:一台机器同一时间只能加工一个工序
      xiaopangoj.com
      。
      安排顺序:
      
      输入的工件号序列决定了操作的处理顺序。例如序列[1,1,2,3,3,2]表示依次处理:工件1的第1道工序→工件1的第2道工序→工件2的第1道工序→…→工件2的第2道工序
      CSDN博客
      。
      插入规则:
      
      尽量靠前:每个操作必须放在最早可能的时间,且优先选择最前面的空档。例如机器有多个空闲时段时,选第一个能容纳该操作的空档
      xiaopangoj.com
      。
      输入输出说明
      输入:
      
      第1行:机器数m和工件数n(均<20)。
      第2行:m×n个工件号,为操作安排顺序。
      接下来2n行:前n行为每个工件各工序的机器号,后n行为各工序的加工时间
      xiaopangoj.com
      。
      输出:
      
      完成所有工序的最少总时间。
      示例解析(样例输入)
      输入:
      
      2 3
      1 1 2 3 3 2
      1 2  // 工件1工序1用机器1,工序2用机器2
      1 2  // 工件2工序1用机器1,工序2用机器2
      2 1  // 工件3工序1用机器2,工序2用机器1
      3 2  // 工件1工序1耗时3,工序2耗时2
      2 5  // 工件2工序1耗时2,工序2耗时5
      2 4  // 工件3工序1耗时2,工序2耗时4
      安排过程:
      
      工件1-工序1(机器1,3分钟):最早开始,占时间1-3。
      工件1-工序2(机器2,2分钟):需等工件1-工序1完成(时间3),机器2此时空闲,占时间4-5。
      工件2-工序1(机器1,2分钟):需等机器1空闲(时间3),占时间4-5。
      工件3-工序1(机器2,2分钟):机器2最早空闲时段为1-3,占时间1-2。
      工件3-工序2(机器1,4分钟):需等工件3-工序1完成(时间2),机器1在5后空闲,占时间6-9。
      工件2-工序2(机器2,5分钟):需等工件2-工序1完成(时间5),机器2在5后空闲,占时间6-10。
      总时间:所有工序完成的最晚时间为10。
      
      为何方案2错误?
      方案2中,工件3-工序2(机器1,4分钟)被安排在8-11,违反“尽量靠前”原则。机器1在5后即空闲,应优先安排在6-9
      
      核心思路
      记录状态:跟踪每个工件各工序的完成时间,以及每台机器的已占用时段。
      计算空档:对每个操作,找出其所需机器的所有空闲时段,选择最早能容纳该操作的空档。
      更新数据:插入操作后,更新工件工序完成时间和机器占用情况。
      通过模拟上述过程,即可唯一确定调度方案并计算总时间。
      
      • 1

      信息

      ID
      307
      时间
      1000ms
      内存
      256MiB
      难度
      3
      标签
      (无)
      递交数
      35
      已通过
      22
      上传者