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

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

看了题解b站上面视频才搞定,但是也是纯复制打了一遍而已。

本题最大的难点就是变量太多了,逻辑很绕,第一次看的时候自己都懵了。

一定要画图,画图,画图

画图经过自己的逻辑推导一遍,然后用自己的逻辑写出下面这些

下面这些是b站老师的总结 我就搬过来了

//1.给定安排顺序,找到一个需要的工件
//2.找到工件,找到插入的这个工件的工序
//3.找到需要在那个机器工作
//4.找到这个工序需要花多少时间
//5.找到工序最早开始的时间
//6.在当前机器上,最早时间为起点向右扫,找到存放区间
//7.将工序放在空位上
//8.将这段时间设置为工作中
 
//需要存的东西
//m,n
//安排顺序
//每个工件 每个工序的机器编号
//每个工件 每个工序的工作时间
//记录当前这个工件是哪个工序
//记录工序的结束最后时间
//每个机器都有时间轴

附代码

#include 
//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>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

你可能感兴趣的:(算法)