次元传送门:洛谷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; }