这是做到现在为止最难的一次
看了题解b站上面视频才搞定,但是也是纯复制打了一遍而已。
本题最大的难点就是变量太多了,逻辑很绕,第一次看的时候自己都懵了。
一定要画图,画图,画图
画图经过自己的逻辑推导一遍,然后用自己的逻辑写出下面这些
下面这些是b站老师的总结 我就搬过来了
//1.给定安排顺序,找到一个需要的工件
//2.找到工件,找到插入的这个工件的工序
//3.找到需要在那个机器工作
//4.找到这个工序需要花多少时间
//5.找到工序最早开始的时间
//6.在当前机器上,最早时间为起点向右扫,找到存放区间
//7.将工序放在空位上
//8.将这段时间设置为工作中
//需要存的东西
//m,n
//安排顺序
//每个工件 每个工序的机器编号
//每个工件 每个工序的工作时间
//记录当前这个工件是哪个工序
//记录工序的结束最后时间
//每个机器都有时间轴
附代码
#include <bits/stdc++.h>
//1.给定安排顺序,找到一个需要的工件
//2.找到工件,找到插入的这个工件的工序
//3.找到需要在那个机器工作
//4.找到这个工序需要花多少时间
//5.找到工序最早开始的时间
//6.在当前机器上,最早时间为起点向右扫,找到存放区间
//7.将工序放在空位上
//8.将这段时间设置为工作中
//需要存的东西
//m,n
//安排顺序
//每个工件 每个工序的机器编号
//每个工件 每个工序的工作时间
//记录当前这个工件是哪个工序
//记录工序的结束最后时间
//每个机器都有时间轴
using namespace std;
int m,n;
int shunxu[400]={0};//放顺序
struct shiti{
int jiqibianh;
int gongzuosj;
}gongjian[20][20]; //每个工件不同机器 n个工件(20)的m个工序(20)的机器号和加工时间
int arrgx[20];//放工序
int lasttime[20]={0};
int alltime[20][20*20*20]={0};
void init(){
cin>>m>>n;
for(int i=0;i<m*n;i++){
cin>>shunxu[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>gongjian[i][j].jiqibianh;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>gongjian[i][j].gongzuosj;
}
}
for(int i=1;i<=n;i++){
arrgx[i]=1;
}
}
bool judge(int begintime,int endtime,int jiqihao){
for(int i=begintime;i<=endtime;i++){
if(alltime[jiqihao][i]==1)return false;
}
return true;
}
void chuli(){
for(int i=0;i<m*n;i++){
int gj=shunxu[i];
int gx=arrgx[gj]++;//后面aargx里面会++
int jiqi=gongjian[gj][gx].jiqibianh;
int shijian=gongjian[gj][gx].gongzuosj;
int begintime=lasttime[gj];
while(1){
if(judge(begintime+1,begintime+shijian,jiqi)){
for(int j=begintime+1;j<=begintime+shijian;j++){
alltime[jiqi][j]=1;
}
lasttime[gj]=begintime+shijian;
break;
}
begintime++;
}
}
}
int main(){
init();
chuli();
int max=lasttime[1];
for(int i=1;i<=n;i++){
if(max<lasttime[i])max=lasttime[i];
}
cout<<max;
}