程式設計之美 1 8小飛的電梯排程演算法

2022-03-23 04:38:17 字數 1805 閱讀 8844

題目:

亞洲微軟研究院所在的希格瑪大廈一共有6部電梯。在高峰時間,每層都有人上下,電梯每層都停。實習生小飛常常會被每層都停的電梯弄的很不耐煩,於是他提出了這樣乙個辦法:

由於樓層並不算太高,那麼在繁忙的上下班時間,每次電梯從一層往上走時,我們只允許電梯停在其中的某一層。所有乘客從一樓上電梯,到達某層後,電梯停下來,所有乘客再從這裡爬樓梯到自己的目的層。在一樓的時候,每個乘客選擇自己的目的層,電梯則計算出應停的樓層。

問:電梯停在哪一層樓,能夠保證這次乘坐電梯的所有乘客爬樓梯的層數之和最少?

方法一:暴力列舉,時間複雜度o(n^2)

用陣列nperson[i]存放在第i層下樓的人數,在不同的i層停靠,求所有人需要走的樓層總和,找出總和最小的樓層target,輸出。用兩重迴圈完成計算。

1/*2

* 1.8.13*

4* created on: jan 9, 2016

5* author: seekhit6*/

7 #include "

iostream"8

#define n 100910

using

namespace

std;

1112

int func(int n, int

nperson)28}

29return

targetfloor;30}

3132

intmain()

4243 target =func(n, nperson);

44 cout<

電梯停靠最優層數為:

"45 }

方法二:時間複雜度為o(n)的動態規劃的演算法

降低時間複雜度,求解。假設停在i層,可以計算出所有乘客需要爬的樓層總數y。設n1個人在i層以下下樓,n2個人在i層下樓,n3個人在i層以上下樓。

如果現在電梯改在i-1層停靠,現在所有i層和i層以上的都要多走一樓,相當於,總共多爬了n2+n3層,而i層以下的所有人少爬了一樓,就是少了n1層。總數變成了n2+n3-n1層,如果n2+n3-n1反之,如果i+1層停靠,所有乘客爬的樓層數變成了n1+n2-n3,如果n1+n2-n3書上給的程式就是用公升樓的方式來判斷的,也可以用降樓來動態規劃最優樓層數。

1/*2

* 1.8.2動態規劃 3*

4* created on: jan 9, 2016

5* author: seekhit6*/

7 #include "

iostream"8

#define n 100910

using

namespace

std;

1112

int func(int n, int

nperson)

2223

for(int i=2;i<=n;i++)

31else

32break;33

}34return

targetfloor;35}

3637

intmain()

4748 target =func(n, nperson);

49 cout<

電梯停靠最優層數為:

"50 }

執行結果:

擴充套件問題:

往上爬比往下走要累,往上爬一層消耗k個單位的能量,往下走只消耗1個單位的能量,求讓所有人消耗的能量最少。

解法:只需將計算n1+n2-n3變成n1+n2-n3*k即可。其餘的都一樣。

程式設計之美 1 8 小飛的電梯排程演算法

程式設計之美 1.8 小飛的電梯排程演算法 亞洲微軟研究院所在的希格瑪大廈一共有6部電梯。在高峰時間,每層都有人上下,電梯每層都停。實習生小飛常常會被每層都停的電梯弄的很不耐煩,於是他提出了這樣乙個辦法 由於樓層並不算太高,那麼在繁忙的上下班時間,每次電梯從一層往上走時,我們只允許電梯停在其中的某一...

程式設計之美 小飛的電梯排程演算法

public class aptelevator person i 表示要到第i層的人數 elevator.opt person system.out.println elevator.targetfloor elevator.minstairs public aptelevator public ...

程式設計之美 小飛的電梯排程演算法

一.問題描述 亞洲微軟研究院所在的希格瑪大廈一共有6部電梯。在高峰時間,每層都有人上下,電梯每層都停。實習生小飛常常會被每層都停的電梯弄的很不耐煩,於是他提出了這樣乙個辦法 由於樓層並不算太高,那麼在繁忙的上下班時間,每次電梯從一層往上走時,我們只允許電梯停在其中的某一層。所有乘客從一樓上電梯,到達...