次元传送门:洛谷P1065
思路
简单讲一下用到的数组含义
work 第i个工件已经做了几道工序
num 第i个工序的安排顺序
finnish 第i个工件每道工序的结束时间
need 第i个工件第j道工序需要的机器
tim 第i个工件第j道工序需要的时间
mac 第i个机器的状态
我们遍历时间线找出可以安排下去的工序就安排下去即可 (因为输入已经满足最优)
代码
#include<iostream>
using namespace std;
#define maxn 25
int work[maxn],num[maxn*
maxn],finish[maxn];
int tim[maxn][maxn],need[maxn][maxn],mac[maxn][maxn*
maxn];
int n,m,cnt,ans;
int main()
{
cin>>m>>
n;
for(
int i=
1;i<=n*m;i++) cin>>num[i];
//输入工序顺序
for(
int i=
1;i<=n;i++
)
for(
int j=
1;j<=m;j++) cin>>
need[i][j];
for(
int i=
1;i<=n;i++
)
for(
int j=
1;j<=m;j++) cin>>
tim[i][j];
for(
int i=
1;i<=n*m;i++
)
{
work[num[i]]++;
//此工件工序++
for(
int j=finish[num[i]]+
1;;j++)
//遍历时间线
{
if(!mac[need[num[i]][work[num[i]]]][j]) cnt++;
//如果此时需要的机器闲着
else cnt=
0;
if(cnt==tim[num[i]][work[num[i]]])
//如果满足时间可以插入
{
for(
int k=j-cnt+
1;k<=j;k++) mac[need[num[i]][work[num[i]]]][k]=
1;
//插入
cnt=
0;
//清除
finish[num[i]]=j;
//结束时间后推
break;
}
}
}
for(
int i=
1;i<=n;i++
)
ans=max(ans,finish[i]);
//最后时间为所有工件中最后完成的
cout<<
ans;
}
转载于:https://www.cnblogs.com/BrokenString/p/9851833.html
相关资源:JAVA上百实例源码以及开源项目