电梯调度问题——《编程之美》Java实现
2017-09-30 本文已影响0人
Jiafu
来自《编程之美》
电梯调度问题:亚洲微软研究院所在的希格玛大厦一共有6部电梯。在高峰时间,每层都有人上下,电梯每层都停。实习生小飞常常会被每层都停的电梯弄的很不耐烦,于是他提出了这样一个办法:
由于楼层并不算太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层。所有乘客从一楼上电梯,到达某层后,电梯停下来,所有乘客再从这里爬楼梯到自己的目的层。在一楼的时候,每个乘客选择自己的目的层,电梯则计算出应停的楼层。
问:电梯停在哪一层楼,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少?
思路:假设电梯现在停在第i层,i层以下的人有N1个,i层有N2个,i层以上的人有N3个,当前需要走的楼梯数为Y。当电梯再往上走一层时,i层及i层以下的人一共需要多走N1+N2步,而i层以上的人则一共少走了N3步,所以当N1+N2时,电梯应该继续往上走。
Java代码:
public class LiftProblem {
public static int stopLift(int[] to) {
if (to.length < 2) {
return -1;
}
int n1 = 0, n2 = to[1], n3= 0, y = 0;
// 计算一层及以上的人数
for (int i = 1; i < to.length; i++) {
n3 += to[i];
y += (i - 1) * to[i];
}
for(int i = 1; i < to.length; i++) {
n2 = to[i];
n1 += to[i - 1];
n3 = n3 - n2;
if (n1 + n2 >= n3) {
return i;
}
}
return -1;
}
public static void main(String[] args) {
int[] to = {0, 1, 2 ,3 ,5 ,6, 7};
System.out.format("电梯应该停在第%d层。", stopLift(to));
}
}