流水作业调度问题JAVA代码

    xiaoxiao2021-08-25  81

    流水作业调度问题 描述: N个作业{1,2,………,n}要在由两台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi,1≤i≤n。流水作业高度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。 可以假定任何任务一旦开始加工,就不允许被中断,直到该任务被完成,即非优先调度。 输入: 输入包含若干个用例,第一行为一个正整数K(1<=K<=1000),表示用例个数,接下来K个用例,每个用例第一个为作业数N(1<=N<=1000),接下来N行,每行两个非负整数,分别表示在第一台机器和第二台机器上加工时间。 输出: 每个用例用一行输出采用最优调度所用的总时间,即从第一台机器开始到第二台机器结束的时间。 样例输入: 1 4 5 6 12 2 4 14 8 7 样例输出:

    33

    import java.util.Scanner; public class The982 { static node[] w = new node[1010]; static int n = 0, T, i, j; public static void main(String[] args) { int start1 = 0, start2 = 0; Scanner in = new Scanner(System.in); T = in.nextInt(); while(T-- > 0){ start1 = start2 = 0; n = in.nextInt(); for(i = 0; i < n; i++){ w[i] = new node(); w[i].a = in.nextInt(); w[i].b = in.nextInt(); if(w[i].a < w[i].b) w[i].flag = 1; else w[i].flag = 0; w[i].v = Math.min(w[i].a, w[i].b); } } sort(); for(i = 0; i < n; i++) { if(w[i].flag == 1) { start1 += w[i].a; if(start1 >= start2) start2 = start1 + w[i].b; else start2 = start2 + w[i].b; } } for(i = n - 1; i >= 0; i--) { if(w[i].flag == 0) { start1 += w[i].a; if(start1 >= start2) start2 = start1 + w[i].b; else start2 = start2 + w[i].b; } } System.out.printf("%d\n", start1 > start2 ? start1 : start2); } static void sort(){ node t = new node(); for(i = 0; i < n - 1; i++){ for(j = 0; j < n - i - 1; j++){ if(w[j].v > w[j+1].v){ t = w[j]; w[j] = w[j+1]; w[j+1] = t; } } } } } class node{ int a, b; int flag, v; }

    转载请注明原文地址: https://ju.6miu.com/read-677111.html

    最新回复(0)