1. 程式人生 > >《程式設計之美》讀書筆記之[小飛電梯排程演算法]

《程式設計之美》讀書筆記之[小飛電梯排程演算法]

   在高峰時間,實習生小飛常常會被電梯每層樓都停弄得很不耐煩,於是他想出了這樣一個辦法:由於樓層並不高,那麼在繁忙的時間,每次電梯從一層往上走時,我們只允許電梯停在其中的某一層。所有乘客都從一樓上電梯,到達某層樓後,電梯聽下來,所有乘客再從這裡爬樓梯到自己的目的層。在一樓時,每個乘客選擇自己的目的層,電梯則自動計算出應停的樓層。
  問:電梯停在哪一層樓,能夠保證這次乘坐電梯的所有乘客爬樓梯的層數之和最少?
附上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();
	}

}

待會在自己研究個其他的方法