- 题解
DAY5机器题解
- @ 2024-8-9 19:17:37
题意解析
有个零件,按一定的顺序进行加工,需要进行道工序,每道工序需要在不同的机器上加工,并耗费不同的时间。同一台机器同时只能加工一个零件,必须先进行前面的工序在进行后面的工序,求最少需要多长时间。
思路解析
由于一道工序有多种数据,但我们又无法改变加工顺序,因此只能用多个数组分别记录时间,机器,零件。 但这样我们无法知道现在是第几个工序,所以需要用一个桶记录每个零件的加工次数。 因为必须先进行前面的工序在进行后面的工序,所以还需要一个数组来记录第个零件上一次在何处加工。 再用一个数组记录加工情况,每次从上一次加工结束处遍历这个数组,直到找到一个长度为这道工序所需时间以上的空隙,将其标为正在加工,并记录下加工结束时间, 找到最大值并输出。
#include<bits/stdc++.h>
using namespace std;
int m,n,vis[20][8005],st[405],s[25][25],t[25][25],c[25],last[25],maxx;
void fd(int x,int y){
int idx=s[x][y],nt=t[x][y],res=0;//机器,时间,空隙长度
for(int i=last[x]+1;;i++){
if(vis[idx][i]==0)res++;//空隙长度加一
else res=0;//空隙长度清零
if(res==nt){
maxx=max(maxx,i);//统计最后一次加工
last[x]=i;//更新上一次加工时间
for(int j=i-res+1;j<=i;j++)vis[idx][j]=1;//记录为已加工
return ;
}
}
}
int main(){
//freopen("jq.in", "r", stdin);
//freopen("jq.out", "w", stdout);
cin>>m>>n;
for(int i=1;i<=n*m;i++)cin>>st[i];//输入加工顺序
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>s[i][j];//输入加工所需机器
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>t[i][j];//输入加工所需时间
for(int i=1;i<=n*m;i++){
c[st[i]]++;//加工次数加一
fd(st[i],c[st[i]]);
}
cout<<maxx;
}
0 条评论
目前还没有评论...