兄弟们大胆模拟即可,数据很小,不用怕超时
查看原帖
兄弟们大胆模拟即可,数据很小,不用怕超时
1107543
yezhufenglv楼主2024/9/29 21:01

附上ac代码,注释很详细,求赞

#include <iostream>
using namespace std;
//数据很小,遍历吧,应该不会超时
//记录当前工件的状态
int machain[25][10000];   //每个机器每个时间的状态
int t[25][25];        //每个工件的步骤需要多久时间 同时记录上一个步骤的结束时间
int needmachain[25][25];  //每个步骤需要哪个机器
int p[25];                 //每工件完成的工序指针
int q[500];                //读入的推荐顺序
int main()
{
	int n, m; cin >> n >> m;
	for (int i = 1; i <= n * m; i++)
	{
		cin >> q[i];
	}
	for (int i = 1; i <= m; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			cin >> needmachain[i][j];       
		}
	}
	for (int i = 1; i <= m; i++)
		for (int j = 1; j <= n; j++)
			cin >> t[i][j];
	for (int i = 1; i <= n * m; i++)
	{
		int thing = q[i];        //哪个元件
		int process = ++p[thing]; //那个步骤
		int work_ma = needmachain[thing][process];
		int need_t = t[thing][process];
		for (int i = t[thing][process-1]+1; i < 10000; i++)   //从上一个工序的结束时间开始遍历
		{
			if (machain[work_ma][i])                         //此时间占用就跳过
				continue;
			int p = i;                                          
			while (p <= i + need_t - 1 && !machain[work_ma][p])
				p++;
			if (p == i + need_t)                             //满足的话就是说这个时间段够用
			{
				while (i < p)
				{	
					machain[work_ma][i] = true;
					i++;
				}                                          //占用这个时间段
				machain[work_ma][0] = max(machain[work_ma][0], p-1);  //记录这个机器的最长时间
				t[thing][process] = p-1;                              //记录这道工序的结束时间 方便下一个工序使用
				break;                                                //结束
			}
			else         //意味着这个时间段虽然有空位但是空位不够 就让i去遍历后面的时间 直到找到足够的时间段
			{
				i = p;
			}
		}
	}
	int res = 0;
	for (int i = 1; i <= n; i++)
		res = max(res, machain[i][0]);         //找到全部机器的最长使用时间
	cout << res << endl;
	return 0;
}
2024/9/29 21:01
加载中...