附带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;
}