求大神指点
查看原帖
求大神指点
621557
newtwg楼主2022/2/23 21:01

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;
}
2022/2/23 21:01
加载中...