《程式設計之美》讀書筆記之[小飛電梯排程演算法]
阿新 • • 發佈:2019-02-08
在高峰時間,實習生小飛常常會被電梯每層樓都停弄得很不耐煩,於是他想出了這樣一個辦法:由於樓層並不高,那麼在繁忙的時間,每次電梯從一層往上走時,我們只允許電梯停在其中的某一層。所有乘客都從一樓上電梯,到達某層樓後,電梯聽下來,所有乘客再從這裡爬樓梯到自己的目的層。在一樓時,每個乘客選擇自己的目的層,電梯則自動計算出應停的樓層。
問:電梯停在哪一層樓,能夠保證這次乘坐電梯的所有乘客爬樓梯的層數之和最少?
待會在自己研究個其他的方法
問:電梯停在哪一層樓,能夠保證這次乘坐電梯的所有乘客爬樓梯的層數之和最少?
附上java的實現方式:
package test.alg; public class elevetor { //nPerson[i]表示在第i層下電梯的人數 int[] nPerson = {0,2,5,7,8,9,6,6,1,4,4,8,5,2,4,5,8,6,3,3,5,9,9,6,6,9,8,8,5,5,9,6,6,3}; int nMinFloor,nTargetFloor; //n2是在第i層下電梯的人數,n1是在第i層以下下電梯的人數,n3是在第i層以上 下電梯的人數 int n1 = 0; int n2 = nPerson[1]; int n3 = 0; int N = nPerson.length - 1; public void control(){ for(int i = 2;i<=N;i++){ n3 += nPerson[i]; nMinFloor += nPerson[i] * (i-1); } for(int i = 2; i<=N;i++){ if(n1 + n2 < n3){ nTargetFloor = i; nMinFloor += n1+n2-n3; n1 += n2; n2 = nPerson[i]; n3 -= nPerson[i]; }else break; } System.out.println("把目標樓層定為:"+nTargetFloor); System.out.println("有最小值:"+nMinFloor); } public static void main(String[] args) { new elevetor().control(); } }
待會在自己研究個其他的方法