《程式設計之美》第1.8節:小飛的電梯排程演算法
假設樓層共有n層,電梯停在第x層,要去第i層的乘客數目總數為total[i],所爬樓梯的總數就是sum,求使得這個和最小的x的值,即電梯停的樓層數。
stop1函式是o(n^2)的演算法,就是假設在每層樓停下,計算此時需要爬的樓梯數,如果比最小的少,則賦值。
stop2函式時o(n)時間的演算法,這裡如果電梯當前層數為i,在i之前的人總的需要爬樓梯數為totalbefore,在i之後需要爬的總樓梯數時totalnum,則在i+1層時,前面需要爬的樓梯數增加了totalbefore+total[i],後面的人爬樓梯總數減少了totalnum,當然減少之後,totalnum此時應更新為totalnum-=total[i]。這樣,當遍歷完整個樓層以後就能夠得到最優解。
stop3函式比較有意思,也是《程式設計之美》給出的解法:在第i層停下時,假設有n1個人在第i層以下,有n2個人在第i層,有n3個人在i層以上,假如在第i+1層停,此時增加的向上爬樓梯數為n1+n2,減少的向下爬樓梯數為n3,假如此時n1+n2
注意stop3中,為什麼如果n1+n2
stop4是後面的擴充套件問題的解,即此時上樓梯需要消耗的能量值為k,下樓梯消耗的能量值為1,求出最佳的停樓梯的地點。如果各層的人數不變,則k越大,求得的電梯停下來的最佳樓層越高,這是顯而易見的,假設k為無窮大,則電梯必然是在最高層停下來的。
#include#includeusing namespace std;
pairstop1(int total,int n)
pairstop2(int total,int n)
} return pair(targetfloor+1,nminfloor);
}pairstop3(int total,int n)
//第三個引數k表示上一層樓所花費的能力值,根據實驗可以看出,
//k值越大,則合適的樓層數越高。
pairstop4(int total,int n,int k)
int hundredrand()
int main()
{ const int n=56;
int a[n];
generate(a,a+n,hundredrand);
pairp=stop1(a,n);
cout<
小飛的電梯排程演算法
1 問題描述 某大廈一共有6部電梯,在高峰時間,每層都有人上下,電梯在每層都停,實習生小飛常常會被每層都停的電梯弄的很不耐煩,於是他提出了這樣乙個辦法 由於樓層不太高,每次電梯往上走時,我們只允許電梯停在其中的某一層。所有乘客都從一樓上電梯,到達某層後,電梯停下來,所有乘客再從這裡爬樓梯到自己的目的...
1 8 小飛的電梯排程演算法
題目 有一棟樓,現在設計一種電梯排程演算法 電梯在一樓讓大家上電梯,然後根據大家選擇要到的樓層算出某一樓層i,電梯在i層停下讓所有人下電梯,然後大家爬樓梯達到自己的樓層。請問電梯停在哪一層,可以使得這一次的所有乘客爬樓層之和最短?一 最直接最簡單的方法就是直接列舉從第一層到最後一層,然後算出電梯停在...
1 8 小飛的電梯排程演算法
題目 有一棟樓,如今設計一種電梯排程演算法 電梯在一樓讓大家上電梯,然後依據大家選擇要到的樓層算出某一樓層i,電梯在i層停下讓全部人下電梯,然後大家爬樓梯達到自己的樓層。請問電梯停在哪一層。能夠使得這一次的全部乘客爬樓層之和最短?一 最直接最簡單的方法就是直接列舉從第一層到最後一層,然後算出電梯停在...