题目链接
题干是真的长,还贼复杂,半天才看懂意思.
看到题解之前,我一直不敢相信这真的是个暴力模拟题…
思路基本就是题解的,自己敲的时候加了思路注释
#include <bits/stdc++.h>
using namespace std;
const int N = 25;
const int T = 100005;
struct info//加工属性
{
int id;//在第几台机器加工
int cost;//消耗的时间
};
int workList[405];//工作列表
info wp[N][N];//工件属性,编号/个数
int mac[N][T];//机器时间节点的使用情况,编号/时间轴
int step[N];//工件加工到了第几步
int lastTime[N];//工件加工完的时间
int ans;
int m,n;
int main()
{
//输入部分,rt
cin >> m >> n;
for(int i = 0 ; i < m * n ; i++)
cin >> workList[i];
for(int i = 0 ; i < n ; i++)
for(int j = 0 ; j < m ; j++)
cin >> wp[i][j].id;
for(int i = 0 ; i < n ; i++)
for(int j = 0 ; j < m ; j++)
cin >> wp[i][j].cost;
for(int i = 0 ; i < m * n ; i++)
{
int now = workList[i] - 1;//当前加工零件的编号
int id = wp[now][step[now]].id;//当前零件加工步骤的机器编号
int cost = wp[now][step[now]].cost;//当前零件加工步骤的耗时
int s = 0;//计时器
for(int j = lastTime[now] + 1 ; j < T ; j++)
{
if(!mac[id][j])//遇到空就加
s++;
else//时间不够,清零
s = 0;
if(s == cost)//加满了
{
for(int k = j - cost + 1 ; k <= j ; k++)//时间段占用
mac[id][k] = 1;
ans = max(ans,j);//更新答案
lastTime[now] = j;//更新时间
break;
}
}
step[now]++;//步骤+1
}
cout << ans;
return 0;
}