程式設計之美1.8小飛的電梯排程演算法擴充套件問題
阿新 • • 發佈:2019-02-18
設有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; } }