过了,但是代码又臭又长,求改进
查看原帖
过了,但是代码又臭又长,求改进
1096519
milk2715093695楼主2023/11/5 19:48
#include <stdio.h>

#define MAX_MACHINES 20
#define MAX_JOBS 20
#define MAX_PROCESSES 20
#define MAX(x, y) ((x) > (y)) ? (x) : (y)

struct process{ //记录某个工序使用的机器编号,花费的时间以及加工完该工序的时间
    int machine;
    int cost_time;
    int end_time;
};
struct machine_process{ //记录某台机器的某一次加工的开始、结束时间与下一次加工的位置(链表)
    int start_time;
    int end_time;
    int next_process;
};

int job_order[MAX_MACHINES * MAX_JOBS];
int done[MAX_JOBS] = {0};
int occupied[MAX_MACHINES] = {0};
int heads[MAX_MACHINES] = {0};
struct process jobs[MAX_JOBS][MAX_PROCESSES];
struct machine_process machines[MAX_MACHINES][MAX_JOBS * MAX_PROCESSES];
//job_order:加工顺序
//done:记录目前该零件已完成的工序数
//occupied:记录各台机器有几个加工预约
//heads:记录每个链表的头
//jobs:储存各个零件的各个工序的信息
//machines:记录各台机器加工的各个时段

int main(void) {
    int m, n;
    scanf("%d %d", &m, &n);
    
    for (int i = 0; i < m * n; ++i) {
        scanf("%d", &job_order[i]);
    }
    
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            scanf("%d", &jobs[i][j].machine);
        }
    }
    
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            scanf("%d", &jobs[i][j].cost_time);
        }
    }   //读入部分
    
    for (int i = 0; i < m; ++i) {
        machines[i][0].start_time = 0;
        machines[i][0].end_time = 0;
        machines[i][0].next_process = -1;
    }
    //接下来分别进行m*n个工序
    for (int i = 0; i < m * n; ++i) {
        int job = job_order[i] - 1;
        int process = done[job]++;
        int machine = jobs[job][process].machine - 1;
        int cost_time = jobs[job][process].cost_time;
        int end_time = (process - 1 >= 0) ? jobs[job][process - 1].end_time : 0;
        int tail = occupied[machine]++;
        //job:为当前加工的工件
        //process:当前工件的工序
        //machine:加工该工序的机器
        //end_time:上一个工序完成的时间
        
        int p = heads[machine];
        struct machine_process cur;
        
        cur.next_process = -1;
        cur.start_time = 0;
        cur.end_time = 0;
        machines[machine][tail] = cur;
        //把当前工序加入machines中
        
        if (tail == 0) {
            machines[machine][tail].start_time = MAX(0, end_time);
            machines[machine][tail].end_time = machines[machine][tail].start_time + cost_time;
            jobs[job][process].end_time = machines[machine][tail].end_time;
            continue;
        } else if (machines[machine][p].start_time - (MAX(end_time, 0)) >= cost_time) {
            machines[machine][tail].next_process = heads[machine];
            heads[machine] = tail;
            machines[machine][tail].start_time = MAX(0, end_time);
            machines[machine][tail].end_time = machines[machine][tail].start_time + cost_time;
            jobs[job][process].end_time = machines[machine][tail].end_time;
            continue;
        }
        //处理加入到第一个的情况
        
        while (p != -1) {
            int next_start = (machines[machine][p].next_process == -1) ? 1000000 : machines[machine][machines[machine][p].next_process].start_time;
            int end = machines[machine][p].end_time;
            //next_start:该机器下一次加工的时间
            //end:该机器本次的停工时间
            
            if (next_start - (MAX(end, end_time)) >= cost_time) {
                machines[machine][tail].next_process = machines[machine][p].next_process;
                machines[machine][p].next_process = tail;
                machines[machine][tail].start_time = MAX(end, end_time);
                machines[machine][tail].end_time = machines[machine][tail].start_time + cost_time;
                break;
            }
            //在链表中插入元素
            p = machines[machine][p].next_process;
        }
        jobs[job][process].end_time = machines[machine][tail].end_time;
    }
    int max = 0;
    for (int i = 0; i < m; ++i) {
        int p = heads[i];
        while (machines[i][p].next_process != -1) {
            p = machines[i][p].next_process;
        }
        max = MAX(max, machines[i][p].end_time);
    }
    printf("%d", max);
    return 0;
}

2023/11/5 19:48
加载中...