求助!37分!
查看原帖
求助!37分!
324004
绿茶tevi楼主2024/10/28 16:47
#include<iostream>
using namespace std;
int order[500];//预定序列 
int step[30];//第i个机器准备加工第几步 
int machine[30]; 
struct note{
	int num;//每个工序所使用的机器编号 
	int time; //每个工序花费的时间 
}W[30][30];//i第几个物品,j第几道工序 
int X[30];//i机器上正在加工第几个部件  
int main(){
	int m,n;//m机器数量,n工件数量 
	cin>>m>>n;
	for(int i=1;i<=m*n;i++)cin>>order[i];
	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>W[i][j].num;
	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>W[i][j].time;
	for(int i=0;i<30;i++)step[i]=1;
	
	int k=m*n;//剩余未处理的工序 
	int ans=0;
	while(k>0){
		ans ++;//每一个分钟算一次循环 
		for(int i=1;i<=m;i++){//每一分钟3台机器同时运行 
			if(machine[i]>0){
				machine[i]--;
				if(machine[i]==0){//该工件序列处理完毕 
					step[X[i]]++;//第i台机器处理的工件 X[i]准备进行下一个序列 
					X[i]=0;//第i台机器目前不在处理任何一个工件 
					k--;//预定步骤处理好了一个,所以剩余步骤-1 
				}
			}
			if(machine[i]==0){//机器处于空闲状态时 
				for(int j=1;j<=m*n;j++){//查找可以加工的工件 
					if(order[j]==0)continue;//序列中该部分已经被处理过了 
					if(W[order[j]][step[order[j]]].num==i){//找到了对应的序列(即目的工件的序列要求的机器号与目的机器号相同 
						machine[i]+=W[order[j]][step[order[j]]].time;//加上加工时间 
						X[i]=order[j];//第i台机器正在加工的工件变更为新找到的工件 
						order[j]=0;//序列可加工,说明被处理了 
						break;
					}
				}
			}
		}
	}
	cout<<ans-1;
	return 0;
}
/*总体思路: 
每一分钟同时对m台机子进行操作,直到用完k个工序全部被用完
每一分钟之内通过循环判断该台机器的操作步骤(减去剩余时间or加上新工序(即加上剩余时间))*/ 
2024/10/28 16:47
加载中...