天天看点

编程之美_006小飞的电梯调度算法

// 电梯停在哪一层楼,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少?
public class Test_005
{
    // person[i]表示要到第i层的人数,person[0],person[1]默认为空,即没有人到0,1层
    static int[] person =
    {
            0, 0, 5, 7, 8, 9, 6, 6, 1, 4, 4, 8, 5, 2, 4, 5, 8, 6, 3, 3, 5, 9, 9, 6, 6, 9, 8, 8, 5, 5, 9, 6, 6, 3
    };

    static int stopFloor = 0;// 电梯停的层数
    static int sumFloor = 0;// 乘客爬楼层总和

    static int N = person.length - 1;// 总楼层数

    static int N1 = 0;// 去电梯停留层之下的人数
    static int N2 = 0;// 去电梯停留层的人数
    static int N3 = 0;// 去电梯停留层之上的人数

    /**
     * 计算目标楼层
     * @param person //记录要到每层的人数
     */
    public static void targetFloor(int[] person)
    {
        // 没有到1层以上的就不用坐电梯了
        if (null == person || person.length <= 2)
        {
            return;
        }
        // 当电梯停留在第二层的时候
        stopFloor = 2;
        N1 = 0;
        N2 = person[stopFloor];
        for (int i = 3; i <= N; i++)
        {
            N3 += person[i];
            sumFloor += person[i] * (i - stopFloor);
        }
        // 当电梯停留在3层以上的时候
        for (int i = 3; i <= N; i++)
        {
            if (N1 + N2 < N3)
            {
                stopFloor = i;
                N1 = N1 + N2;
                N2 = person[i];
                N3 = N3 - person[i];
                sumFloor += N1 + N2 - N3;
            }
        }
    }

    public static void main(String[] args)
    {
        targetFloor(person);
        System.out.println("停留在:" + stopFloor + " 乘客爬楼层总和:" + sumFloor);
    }
}