一道较为复杂的模拟题,数组要开大一点(尤其是时间维度)
#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;
}