80分求助
查看原帖
80分求助
323105
CLRLSP楼主2021/8/26 20:21
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int ma=5e5+100;
int n,m;
int cp[300][300],tim[300][300];
int pur[ma]; 
int vis[ma];//该机器是否在被用,以及结束时间 
int ing[ma];//该工件是否在被加工 
int used[ma];//机器被谁用的 
int ans=0;//最后答案 
int done[ma];//哪个工序已经完成了,或正在被完成 
int cnt[5000];//标记哪个工件完成了 
int num[4000];//每个工件加工的第几道工序 
int na=0;
int tool[30];
int Ind;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
	while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}

void Deal(){
	int t=0;
	while(1){
		
		for(int i=1;i<=n;i++){
			if(vis[cp[i][num[i]]]<=t && used[cp[i][num[i]]]==i && ing[i]){
				vis[cp[i][num[i]]]=0;
				used[cp[i][num[i]]]=0;
				ing[i]=0;
				na++;
			}
		} 
		memset(tool,0,sizeof tool);
		Ind=0;
		for(int i=1;i<=n*m;i++){
			if(!vis[cp[pur[i]][num[pur[i]]+1]] && !used[cp[pur[i]][num[pur[i]]+1]] && !ing[pur[i]] && !cnt[i] ){
				//机子是空的
				//没人用
				//这个工件不在加工
				//当前工序没加工过 
				int tag=0;
				for(int j=1;j<=Ind;j++){
					if(t+tim[pur[i]][num[pur[i]]+1] > vis[cp[pur[tool[j]]][num[pur[tool[j]]]]] && cp[pur[i]][num[pur[i]]+1]==cp[pur[tool[j]]][num[pur[tool[j]]]+1]) tag=1;
				}
				if(tag) continue;
                ++num[pur[i]];
				vis[cp[pur[i]][num[pur[i]]]]=t+tim[pur[i]][num[pur[i]]];
				used[cp[pur[i]][num[pur[i]]]]=pur[i];
				ing[pur[i]]=i;
				cnt[i]=1; 
			}
			else if( ing[pur[i]] && !cnt[i]){
				tool[++Ind]=i;
			}
		}
		if(na==n*m){
			ans=t;
			return;
		}
		t++; 
	}
} 
signed main(){
	m=read(),n=read();
	memset(num,0,sizeof num);
	for(int i=1;i<=n*m;i++){
		pur[i]=read();
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++) cp[i][j]=read();
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++) tim[i][j]=read();
	}
	Deal();

	cout<<ans;
}

WA #9 #10 两个点

2021/8/26 20:21
加载中...