洛谷 P1065 作业调度方案 (模拟)

一道较为复杂的模拟题,数组要开大一点(尤其是时间维度)

#include<iostream>
#include<cstdio>
#define MAXN 55
using namespace std;
int n,m,a[MAXN*MAXN],b[MAXN][MAXN],t[MAXN][MAXN],s[MAXN],last[MAXN];
bool tl[MAXN*MAXN][7225];
int res;
bool check(int s,int e,int m){
    for(int i=s;i<=e;i++)
        if(tl[m][i])
            return false;
    return true;
}
int main(){
#ifdef WINE
    freopen("P1065_1.in","r",stdin);
#endif
    scanf("%d%d",&m,&n);
    for(int i=1;i<=n*m;i++)
        scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%d",&b[i][j]); // 工件i的工序j使用的机器
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%d",&t[i][j]); // 工件i的工序j花费时间
    for(int i=1;i<=n*m;i++){
        int cur=a[i]; // 现在正在处理的工件标号
        s[cur]++; // 该工件工序数增加
        int ma=b[cur][s[cur]]; // 当前工件工序使用的机器
        int ti=t[cur][s[cur]]; // 当前工件工序使用的时间
        for(int j=last[cur]+1;;j++) // 从该工件上一次的结束时间开始
            if(check(j,j+ti-1,ma)){ // 检查该机器是否有空
                for(int k=j;k<=j+ti-1;k++)
                    tl[ma][k]=true; // 设置该机器被占用
                last[cur]=j+ti-1; // 更新结束时间
                break;
            }
    }
    for(int i=1;i<=n;i++)
        res=max(res,last[i]);
    printf("%d",res);
    return 0;
}

posted @ 2020-08-05 11:09  winechord  阅读(129)  评论(0编辑  收藏  举报