Subtask #0 过了1,2,11;Subtask #1 过了 1。 Subtask #0 的 3 WA,答案是47,我执行结果只有44,我输出了每一步模拟过程,看不出问题所在。不知道是不是理解题意有什么问题?有大神帮看看吗?代码如下(注释掉的部分是打印模拟过程中的数据,也可以取消注释看一下),感谢感谢!
#include <iostream>
using namespace std;
int M, N;
int main() {
cin >> M >> N;
int JQ[M + 1][2]; //每个机器的工作状态,机器号从1开始,所以+1, 0号不用
//第2维[0] 表示 当前加功的 工件号, [1]还需要的时间倒计时(0为空闲)
for (int i = 0; i <= M; i++) {
JQ[i][0] = 0;
JQ[i][1] = 0;
}
int AP[N * M][4]; // 安排队列
for (int i = 0; i < N * M; i++) {
cin >> AP[i][0]; //队列中的工件号
// AP[i][1] 表示该工件号当前要进行的是第几道工序,0表示已经上机
// AP[i][2] 表示该工序用的机器
// AP[i][3] 表示工件号当前工序需要多少时间
}
int GjJqSj[N + 1][M + 1][2]; //工作的机器和时间, 工件号从1开始,所以+1, 0号不用
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
cin >> GjJqSj[i][j][0]; //i号工件,j号工序,用的是哪个机器号
}
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
cin >> GjJqSj[i][j][1]; //i号工件,j号工序,需要多少时间
}
}
//为安排队列每个工件计算 工序 时间
for (int j, n = 1; n <= N ; n++) {
j = 0;
for (int i = 0; i < N * M; i++) {
if (AP[i][0] == n) {
j++;
AP[i][1] = j; //下一个工序号,上机时清0
AP[i][2] = GjJqSj[n][j][0]; //机器号
AP[i][3] = GjJqSj[n][j][1]; //时间
}
}
}
//开始模拟
int GjGx[N + 1]; //标记一种工件可以被上机器加工的工序号
for (int i = 1; i <= N; i++) GjGx[i] = 1;
int t = 0, finished = 1;
// cout << "==安排顺序==" << endl << "工件号<工序>: 机器号, 需时" << endl;
// for (int i = 0; i < N * M; i++)
// cout << AP[i][0] << "<" << AP[i][1] << ">: " << AP[i][2] << ", " << AP[i][3] << endl;
do {
finished = 1;
//1.机器装件
for (int m = 1; m <= M; m++) {
if (JQ[m][0] == 0) {
//是空机器,就装中用这台机器加工的工件,并确保工件工序正确
for (int i = 0; i <= N * M; i++) {
if (AP[i][2] == m && AP[i][1] == GjGx[AP[i][0]] ) {
AP[i][1] = 0; //本工件本工序已上机
JQ[m][0] = AP[i][0]; //在机器上标注加工的工件号
JQ[m][1] = AP[i][3]; //机器工作的倒计时
break; //一台机器装上一件,就轮下一台
}
}
}
}
//2.机器加工1时间
for (int m = 1; m <= M; m++) {
if (JQ[m][0] != 0) { //有工件在加工的机器
JQ[m][1]--; //机器到计时-1
if (JQ[m][1] == 0) { //机器刚加工做完时
GjGx[JQ[m][0]]++; //标记机器上卸下的工件可以进入的下一个工序
JQ[m][0] = 0; //工件从机器上移走
}
}
if (JQ[m][0] != 0) finished = 0; //只要有一个机器还装着加工,就还没有结束
if (finished == 1) { //对于所有机器同一时间卸下工件的情况,还要判断所有工序是否都已经上机过。
for (int i = 0; i <= N * M; i++) {
if (AP[i][1] != 0) {
finished = 0;
break;
}
}
}
}
t++;
// cout << endl <<"== "<< t << " 时间后 ==:" << endl;
// cout << "工件号[工序]: 机器号, 需时, 倒计时数" << endl;
// for (int i = 0; i < N * M; i++) {
// if (AP[i][1]>0 || JQ[AP[i][2]][0]==AP[i][0]){
// cout << AP[i][0] << "[" << (AP[i][1]==0?"*":to_string(AP[i][1])) << "]: " << AP[i][2] << ", " << AP[i][3];
// if(AP[i][1]==0) cout << ", " << JQ[AP[i][2]][1];
// cout << endl;
// }
// }
// cout << "[机器号]:工件号,倒计时数" << endl;
// for (int i = 1; i <= M; i++) cout << "[" << i << "]:" << JQ[i][0] << "," << JQ[i][1] << "\t";
// cout << endl ;
} while (finished == 0);
// cout << endl <<"总时间数:";
cout << t;
return 0;
}