测试点4 5 6 7 8 10WA,测试点#4应该是47,我这里是46
查看原帖
测试点4 5 6 7 8 10WA,测试点#4应该是47,我这里是46
975789
Crescentrosesama楼主2023/4/16 11:49
#include<iostream>
#include<cstring>
using namespace std;
typedef struct Work
{
	int Time = 0;//当前机器还需要运行多长时间
	int x, y;//当前机器在加工x工件的第y工序
}W;
int main()
{
	W Working[21];//机器状态记录
	int m, n;
	cin >> m >> n;
	int S[450];//顺序存储
	int M[30][30];//第i个工件的第j道工序所需的机器为M[i][j]
	bool AllRight[30][30] = { false };//若第i个工件的第j道工序已经完成AllRight[i][j]=true
	for (int i = 0; i < 30; i++)
		AllRight[i][0] = true;//第0道工序标记为已完成
	memset(M,0,sizeof(M));
	int Num = n*m;//全部的工序数
	int Time[30][30];//i工件j工序所需要的时间
	for (int i = 1; i <= n*m; i++)
		cin >> S[i];
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			cin >> M[i][j];
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			cin >> Time[i][j];//输入
	int Min = 0;//时间记录
	for (; ;Min++)//时间加1
	{
		for (int i = 1; i <= m; i++)//扫描所有机器,发现还有未运行完的机器就将其运行时间减1
		{
			if (Working[i].Time)
			{
				Working[i].Time--;
				//cout <<i<<"号机器" <<"当前时间为" <<Min<<' ' << Working[i].x << ' ' << Working[i].y << endl;
				if (Working[i].Time == 0)//减1后运行时间归零时说明此机器加工的工件的工序结束,将此工序标记为完成,同时总工序数减1
				{
					AllRight[Working[i].x][Working[i].y] = true;
					Num--;
				}
			}
		}
		if (Num == 0)//当所有工序已经完成,退出
		{
			break;
		}
		for (int i = 1; i <= n*m; i++)//扫描每个次序上的工件
		{
			for (int j = 1; j <= m; j++)//扫描此工件的每一个工序
			{
				if (!AllRight[S[i]][j] && AllRight[S[i]][j - 1])//如果此工序未完成且其前一个工序已经完成,说明可以加工
				{
					if (!Working[M[S[i]][j]].Time)//且加工此工序的机器未被占用(即机器剩余运行时间为0),则可以在此机器上加工
					{
						Working[M[S[i]][j]].Time = Time[S[i]][j];//S[i]定位工件,j定位工序
						Working[M[S[i]][j]].x = S[i];
						Working[M[S[i]][j]].y = j;
					}
				}
			}
		}
	}
	cout << Min;
	return 0;
}
2023/4/16 11:49
加载中...