37pts,求调,玄关(有注释,但代码冗长)
查看原帖
37pts,求调,玄关(有注释,但代码冗长)
685183
LightSpot楼主2024/8/11 15:07
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 5050;
int m , n , minn;
int a[MAXN] , id[MAXN][MAXN] , times[MAXN][MAXN]; //a记录加工顺序,id记录某个工件第某道工序的加工机器号,time记录某个工件第某道工序的加工时间 
int lft[MAXN] , step[MAXN] , solve[MAXN]; //lft表示当前机器还需多少时间完成操作,step表示当前工件完成到了哪一步,solve记录当前机器正在加工哪个工件 
int sum;
bool vis[MAXN] , is_made[MAXN] , flag; //vis记录当前操作是否已经正在进行或进行过,is_made记录该工件是否正在加工 
int main()
{
	cin >> m >> n;
	for(int i = 1 ; i <= m * n ; i++) scanf("%d" , &a[i]);
	for(int i = 1 ; i <= n ; i++) for(int j = 1 ; j <= m ; j++) scanf("%d" , &id[i][j]);
	for(int i = 1 ; i <= n ; i++) for(int j = 1 ; j <= m ; j++) scanf("%d" , &times[i][j]);
	do
	{
		minn = 0x7fffffff;
		flag = 0;
		for(int i = 1 ; i <= m * n ; i++)
		{
			if(!vis[i] && !is_made[a[i]] && solve[id[a[i]][step[a[i]] + 1]] == 0) //如果该操作未完成 (id[a[i]][step[a[i]] + 1]为当前工件下一道工序的加工机器)
			{
				if(solve[id[a[i]][step[a[i]] + 1]] == 0) //如果该工件本工序需要的机器未被使用 
				{
					solve[id[a[i]][step[a[i]] + 1]] = a[i];
					vis[i] = 1;
					is_made[a[i]] = 1;
					lft[id[a[i]][step[a[i]] + 1]] += times[a[i]][step[a[i]] + 1]; //增加当前机器的操作时间 
				}
			}
		}
		for(int i = 1 ; i <= m ; i++)
		{
			if(lft[i] != 0) //如果该机器正在进行操作 
			{
				flag = 1;
				if(minn > lft[i]) minn = lft[i]; //记录最小的时间 
			}
		}
		if(flag) sum += minn;
		for(int i = 1 ; i <= m ; i++)
		{
			if(lft[i] != 0)
			{
				lft[i] -= minn;
				if(lft[i] == 0)
				{
					is_made[solve[i]] = 0;
					step[solve[i]]++; //该工件完成的工序增加 
					solve[i] = 0;
				}
			}
		} 
	}
	while(flag);
	cout << sum;
	return 0;
}


2024/8/11 15:07
加载中...