小飛的電梯排程演算法

2021-06-27 04:26:04 字數 1126 閱讀 2263

《程式設計之美》第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層停下讓全部人下電梯,然後大家爬樓梯達到自己的樓層。請問電梯停在哪一層。能夠使得這一次的全部乘客爬樓層之和最短?一 最直接最簡單的方法就是直接列舉從第一層到最後一層,然後算出電梯停在...