Bootstrap

P1065 [NOIP2006 提高组] 作业调度方案 自我经验总计附上题解

这是做到现在为止最难的一次

看了题解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;
}

;