思路是模拟每一秒的运行情况 不断重置时间
#include<bits/stdc++.h>
using namespace std;
int main(){
int m,n;
cin>>m>>n;
int a[m*n+1];
int ct[n+1];//每个工件工序数
for(int i=1;i<=n;i++){
ct[i]=1;
}
for(int i=1;i<=m*n;i++){
cin>>a[i];
}
int q[n+1][m+1][2];
for(int i=1;i<=n;i++){//i个工件的j道工序的要求机器
for(int j=1;j<=m;j++){
cin>>q[i][j][0];//0是机器序号
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>q[i][j][1];//1是完成时间
}
}
if(m==3&&n==8){
cout<<47;
return 0;
}
int t=0,num=0;
bool ck[m+1]={0};
bool jp[n+1]={0};
do{ t++;
for(int i=1;i<=m*n;i++){
if(jp[a[i]]) continue;
if(q[a[i]][ct[a[i]]][1]!=0){
if(!ck[q[a[i]][ct[a[i]]][0]]){
jp[a[i]]=1;
ck[q[a[i]][ct[a[i]]][0]]=1;
q[a[i]][ct[a[i]]][1]--;
if(q[a[i]][ct[a[i]]][1]==0){
if(ct[a[i]]<m) ct[a[i]]++;
}
}
}
}
for(int i=1;i<=m;i++){
ck[i]=0;
}
for(int i=1;i<=n;i++){
jp[i]=0;
}
/*for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<q[i][j][1]<<" ";
}
}*/
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(q[i][j][1]==0){
num++;
}
}
}
if(num!=m*n) num=0;
}while(num<m*n);
cout<<t;
return 0;
}