美文网首页
工作调度问题

工作调度问题

作者: nafoahnaw | 来源:发表于2018-06-12 18:29 被阅读0次
    /**
     * 工作调度问题
     * 有N项工作,每项工作分别在Si时间开始,在Ti时间结束。对于每项工作。你都可以选择参与与否
     * 如果先择了参与那么自始自终都必须全程参与。此外,参与工作的时间段不能重叠
     * (即使是开始的瞬间和结束的瞬间的重叠也是不允许的)你的目标是尽可能多的工作,
     * 那么最多能参与多少项工作呢?
     * @author haofan.whf
     * @version $Id: JobScheduler.java, v 0.1 2018年06月12日 下午5:58 haofan.whf Exp $
     */
    public class JobScheduler {
    
        public void schedule(int N, int[] S, int[] T){
            /**
             * 思路,贪婪算法
             * 我们可以选择3中规则
             * 1.始终选择开始时间最早的工作
             * 2.始终选择耗时最短的工作
             * 3.始终选择结束时间最早的工作
             *
             * 对于规则1我们可以想到一个反例
             * 比如S={1,3,5} T={10,4,6},那么套用规则1我们将只会参与1-10
             * 但是最优解是3-4,5-6
             * 对于规则2我们也可以想到一个反例
             * 比如S={1,3,5} T={4,5,8},那么套用规则2我们将只会参与3-5
             * 但是最优解是1-4,5-8
             *
             * 正确的规则只有3
             */
            Arrays.sort(T);
            int jobCnt = 0;
            int previousEnd = 0;
            for (int i = 0; i < N; i++) {
                if(previousEnd < S[i]){
                    jobCnt ++;
                    previousEnd = T[i];
                    System.out.println("start:" + S[i] + ",end:" + T[i]);
                }
            }
            System.out.println("jobCnt:" + jobCnt);
        }
    
    }
    

    相关文章

      网友评论

          本文标题:工作调度问题

          本文链接:https://www.haomeiwen.com/subject/lvureftx.html