首先.输入
需要存储的东西:
//m,n;
//每个工件,每个工序的机器编号
//每个工序的时间
//记录当前这个工件已经到哪个工序了
//记录当前工件已经完成的工序结束的时间
//各个机器都有一个时间轴
1.按照给定的安排顺序,找到一个需要的工件
2.找到这个工件,当前需要的工序
3.找到这个工件需要插在哪个机器上
4.找到这个工序所需要的时间
5.找到这个工序,当前能开始的最早时间
6.在当前机器上,以最早的时间为起点,从左往右扫,找到一个能放这个工序的时间
7.将这个工序放到空位上
8.将这段时间标记为在工作
#include<iostream>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<vector>
#include<cmath>
#include<ctime>
#include<cctype>
#define IOS std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
#define pi acos(-1);
#include<map>
int n,m,gj_gx[20],gj_last[20],jq_sj[20][16000],apsx[405];
using namespace std;
typedef struct node{
int jqh,sj;
}node;
node gj_sx[20][20];
void ccin(){
cin>>m>>n;
for(int i=0;i<n*m;i++){
cin>>apsx[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>gj_sx[i][j].jqh;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>gj_sx[i][j].sj;
}
}
for(int i=1;i<=n;i++){
gj_gx[i]=1;
}
}
bool judge(int bgtime,int endtime,int jqh){
for(int i=bgtime;i<=endtime;i++){
if(jq_sj[jqh][i]==1)return false;
}
return true;
}
void work(){
for(int i=0;i<m*n;i++){
int gj=apsx[i];
int gx=gj_gx[gj]++;
int jqh=gj_sx[gj][gx].jqh;
int sj=gj_sx[gj][gx].sj;
int bgtime=gj_last[gj];
while(true){
if(judge(bgtime+1,bgtime+sj,jqh)){
for(int j=bgtime+1;j<=bgtime+sj;j++){
jq_sj[jqh][j]=1;
}
gj_last[gj]=bgtime+sj;
break;
}
bgtime++;
}
}
}
int main(){
IOS;
ccin();
work();
cout<<*max_element(gj_last,gj_last+n);
return 0;
}