1 条题解

  • 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;
    }
    
    • 1

    信息

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