只能过#1#2#3#11,其他全WA,找不到问题
查看原帖
只能过#1#2#3#11,其他全WA,找不到问题
521537
日之朝矣楼主2022/1/20 22:29

测试数据#4 in: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
out: 47
自己代码运行结果:41

实在找不到问题,注释尽量写了,希望有大佬能帮忙看一下

import java.util.Scanner;
public class P1065 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt(),
                n = sc.nextInt();
        int[] order = new int[m*n];
        for (int i = 0; i < order.length; i++) {
            order[i] = sc.nextInt();
        }
        // 所使用的机器编号
        int[][] machineCode = new int[n][m];
        for (int i = 0; i < machineCode.length; i++) {
            for (int j = 0; j < m; j++) {
                machineCode[i][j] = sc.nextInt();
            }
        }
        // 每个单件每个工序用时
        int[][] runTime = new int[n][m];
        for (int i = 0; i < runTime.length; i++) {
            for (int j = 0; j < m; j++) {
                runTime[i][j] = sc.nextInt();
            }
        }
        // 时间轴,每多一个机器,多一条时间轴
        int[][] timelines = new int[m][10000];

        // 每个单件上一个工序结束点
        int[] endPoint = new int[n];

        // 每个单件的工序数
        int[] procs = new int[n];

        for (int i = 0; i < order.length; i++) {
            // 单件编号
            int single = order[i]-1;
            // 工序
            int proc = procs[single]++;

            // 该单件这次工序所耗费的时间
            int costTime = runTime[single][proc];
            // 该单件所使用的机器
            int useMachine = machineCode[single][proc]-1;

            // 找到这个工序所用的机器时间轴,从头判断是否有整块时间来加工该工件
            for (int j = endPoint[single]; j < timelines[useMachine].length; j++) {
                boolean isOk = true;
                for (int k = j; k < costTime+j; k++) {
                    if (timelines[useMachine][j] != 0){
                        isOk = false;
                        break;
                    }
                }
                // 如果这一整块时间都是空的,就把工件放在这个时间加工
                if (isOk){
                    // 占用机器这段时间
                    for (int k = j; k < costTime+j; k++) {
                        // 把这些地方的元素改成该单件的编号
                        timelines[useMachine][k] = single+1;
                    }
                    // 记录该工件这一道工序结束时间点
                    endPoint[single] = j + costTime;
                    break;
                }
            }
        }
        int finalTime = 0;
        for (int i = 0; i < endPoint.length; i++) {
            finalTime = Math.max(endPoint[i],finalTime);
        }
        System.out.println(finalTime);
    }
}

2022/1/20 22:29
加载中...