天天看点

编程之美1.8小飞的电梯调度算法扩展问题

设有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;
	}
}
           

继续阅读