1. 程式人生 > >程式設計之美1.8小飛的電梯排程演算法擴充套件問題

程式設計之美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;
	}
}