纯模拟,但是不知道哪里有问题 第四题始终输出44,正确答案47 附上输入: 3 8 6 4 5 1 7 8 4 2 6 5 2 4 1 2 6 8 3 7 1 3 3 7 5 8 1 2 3 1 3 2 3 2 1 2 1 3 3 1 2 1 2 3 3 1 2 1 2 3 4 5 2 3 5 3 6 4 2 4 5 6 3 1 7 7 5 3 4 4 5 8 5 9
#include<iostream>
#include<string>
#include<ctype.h>
using namespace std;
int order[400],mac[20][20],time_[20][20],finish[20];//顺序,工件加工机器顺序,工序时间 ,机器是否完成 ,mac[i][j]是第i个工件的j道工序
//finish -1:未完成(在做) 0:有空位
//mac 0:做完 -1:在做 >=1:机器号
int n,m;
int dotime[20];//dotime是目前的时间情况 [机器号]
int indexofmac(int aim,int& x,int& y){//aim是第几个机器 ,x是工件号,y是工序号,对应机器时要保证前面的工序已经完成
int ti,tj,find=0;
for(ti=0;ti<n*m;ti++){
if(order[ti]==-1) continue;
for(tj=0;tj<m;tj++){
if(mac[order[ti]-1][tj]==0) continue;//order[ti]是工件号,tj是工序号
if(mac[order[ti]-1][tj]!=aim) break;
if(finish[aim-1]==0){
x=order[ti]-1;
y=tj;
mac[x][y]=-1;
finish[aim-1]=-1;
order[ti]=-1;
return 1;
}
else if(finish[aim-1]==-1){
find=1;
break;
}
}
}
return 0;
}
int findmindotime(){
int i,min=0;
for(i=0;i<m;i++){
if(dotime[i]==0) continue;
else if(min==0){
min=dotime[i];
}
else min=(min>dotime[i])?dotime[i]:min;
}
return min;
}
void placeprocess(int a[][2]){
for(int i=0;i<m;i++){
if(dotime[i]!=0) continue;
int temp=indexofmac(i+1,a[i][0],a[i][1]);
if(temp==1) dotime[i]=time_[a[i][0]][a[i][1]];
else dotime[i]=0;
}
}
int main(){
int i,j,t=0;//n:工件数 ,m:机器数,工序数
cin>>m>>n;
for(i=0;i<n*m;i++){
cin>>order[i];
}
for(i=0;i<n;i++){
finish[i]=0;
for(j=0;j<m;j++){
cin>>mac[i][j];
}
}
for(i=0;i<n;i++){
for(j=0;j<m;j++){
cin>>time_[i][j];
}
}
int a[m][2];//m台机器,第一个是机器号上的工件号,第二个是机器号上的工序号 ,a[i][0/1]是第i台机器上的工件号/工序号
for(i=0;i<m;i++){
dotime[i]=0;
}
while(1){
placeprocess(a);
int min=findmindotime();
if(min!=0){
t+=min;
for(i=0;i<m;i++){
if(dotime[i]==0) continue;
else if(dotime[i]==min){
dotime[i]=0;
finish[i]=0;
mac[a[i][0]][a[i][1]]=0;
}
else dotime[i]-=min;
}
}
else{
break;
}
}
cout<<t;
return 0;
}