解法一:枚举。时间复杂度为O(n2)
解法二:
1.假设电梯停在i楼,可计算出所有乘客需要爬的总层数Y。设电梯中N1个乘客目标在i楼以下,N2个乘客目标在i楼,N3个乘客目标在i楼以上。
2.此时,若电梯停在i-1楼,则所有乘客需爬的总层数为:Y-N1+(N2+N3) = Y - (N1 - N2 -N3)
3.反之,若电梯停在i+1楼,则所有乘客需爬的总层数为:Y+N1+N2-N3 = Y + (N1 + N2 - N3)
4.综上,当N1>N2+N3时,电梯停在i-1层更好。当N1+N2<N3时,电梯停在i+1层更好。其他情况下电梯停在i层最好。
5.从第一层开始考察,时间复杂度降低为O(n)
代码 :
for(N1 = 0 , N2 = nPerson[1] , N3 = 0 , i = 2; i<=N ; ++i)
{
N3 += nPerson[i];
Y += nPerson[i] * (i-1);
}
for(i = 2 ; i <=N ; ++i)
{
if(N1 + N2 < N3)
{
nTargetFloor = i;
Y += (N1 + N2 - N3);
N1 += N2;
N2 = nPerson[i];
N3 -= nPerson[i];
}
else
break;
}
return Y;