设有N2个乘客在第i层下,N1个乘客的目的地楼层在第i层以下,N3个乘客的楼层在第i层以上
假设电梯从停在i层改停在为i+1层,停在第i层时消耗的总能量为E
则改为i+1层停之后原先i层以上的乘客即N3个乘客少往上爬一层,原先第i层的N2个乘客需多往下爬一层,原先第i层以下的N1个乘客需多往下爬一层。
所需总能量变为E-N3*K+N1+N2
若N3*K>(N1+N2),则停在i+1层好
若停第i层比停i+1层能量消耗低,会出现停第i层比停第i+2层能量消耗多的情况么
已知 N3*K<(N1+N2)
从i层到i+2层
消耗的能量变为E+2(N1+N2)+nPersons[i+1]-k(N3-nPersons[i+1])>E
因此循环只要有一次停第i层比停i+1层能量消耗低,后面变无需再比较
//nPerson[i]表示到第i层的乘客数目
//N1代表目标楼层在第i层以下的乘客数
//N2代表目标楼层第i层的乘客数
//N3代表目标楼层在第i层以上的乘客数
void (int *nPerson,int k){
int nMinEnergy=0;
int nTargetFloor=1;
int N1,N2,N3;
int i;
for(N1=0,N2=nPerson[1],N3=0,i=2;i<N;i++)
{
N3+=nPerson[i];
nMinEnergy+=nPerson[i]*(i-1)*k;
}
for(i=2;i<N;i++)
{
if(N3*k>(N1+N2)){
nTargetFloor=i;
nMinEnergy=nMinEnergy-N3*K+N1+N2;
N1=N1+nPerson[i-1];
N3-=nPerson[i];
N2=nPerson[i];
}
else
break;
}
}