80分求调
查看原帖
80分求调
1114121
zhoujingyu14楼主2024/8/22 16:49
#include<bits/stdc++.h>
using namespace std;

struct mech{
	int id;//记录机器号 
	int time;//记录时间 
};
mech me[22][22];//记录机器号和时间 
int l[30][10000],r[30][10000],stime[30][30],mid[30],ans=0;//l记录左空隙,r记录右空隙,stime记录下一道工序开始时间,mid记录空隙个数 
int wan[30]={},shunxu[500],m,n;//wan记录每个零件每道工序开始时间,shunxu记录组装顺序 

int main(){
	cin>>m>>n;
	for(int i=1;i<=m*n;++i){
		cin>>shunxu[i];
	}
	for(int i=1;i<=m;++i){
		mid[i]=1;
	}
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			cin>>me[i][j].id;
			r[i][j]=10000;
			l[i][j]=0;
			stime[i][j]=0;
		}
	}
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			cin>>me[i][j].time;
		}
	}
	//基础读入和初始化 
	for(int k=1;k<=m*n;++k){//枚举零件 
		int line=shunxu[k];//当前要加工的零件 
		int nowp=wan[line]+1;//当前要完成的工序号 
		int nowjq=me[line][nowp].id;//当前使用的机器 
		for(int i=1;i<=mid[nowjq];++i){//枚举空隙 
			if(l[nowjq][i]<stime[line][nowp]&&stime[line][nowp]+me[line][nowp].time<=r[nowjq][i]){
				//判断零件能不能从左边界开始加工 
				mid[nowjq]++;//当前机器空隙+1 
				for(int j=mid[nowjq];j>i+1;--j){//为新空隙腾出空位 
					l[nowjq][j]=l[nowjq][j-1];
					r[nowjq][j]=r[nowjq][j-1];
				}
				l[nowjq][i+1]=stime[line][nowp]+me[line][nowp].time;
				//新工序左边就是当前工序结束时间 
				r[nowjq][i+1]=r[nowjq][i];//新空隙右边界就是原空隙右边界 
				r[nowjq][i]=stime[line][nowp];//原空隙右边界变为当前工序起始时间 
				stime[line][nowp+1]=stime[line][nowp]+me[line][nowp].time;
				//修改当前工序起始时间
				break;//不用枚举,跳出循环 
			}else if(stime[line][nowp]<=l[nowjq][i]&&l[nowjq][i]+me[line][nowp].time<=r[nowjq][i]){
				//可以从左边界开始加工
				stime[line][nowp+1]=l[nowjq][i]+me[line][nowp].time;
				//修改下个零件开始加工的时间
				l[nowjq][i]+=me[line][nowp].time;
				//修改左边界
				break; 
			}
		}
		wan[line]++;//当前零件的工序 
	}
	for(int i=1;i<=m;++i){
		ans=max(ans,l[i][mid[i]]);
	}
	cout<<ans;
}
2024/8/22 16:49
加载中...