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

2022-01-25 06:14:21 字數 1828 閱讀 6118

一.問題描述 

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

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

二.演算法描述  

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

1/*2

* o(n^2)3*/

4const

int n = 5;5

int num[n+1];6

intans;

7int min =int_max;89

for(i = 1;i<=n;i++)

1016

if(sum 1721

return

(ans);

22 }

方法二:書上提供的o(n)的動態規劃的演算法。

假設電梯停在i層樓,可以計算出所有乘客要爬樓層的層數為y,假設此時有n1個乘客在i層樓以下,n2個乘客在i層樓,n3個乘客在i層樓以上,則當電梯停在i+1層的時候,n1+n2個乘客要多下一層樓,共多下n1+n2層,n3個乘客要少往上面爬一層樓,少上n3層樓,此時y(i+1) = y(i) + n1+n2-n3,很顯然,當n1+n2

1/*2

o(n) dp3*/

4 #include 5 #include 6

using

namespace

std;78

const

int n = 5;9

int num[n+1

];10

11int

solve()

1222

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

2434

else

35break;36

}37return

ans;38}

3940

intmain()

4153

方法三:中位數

其實這道題目仔細分析起來就是求一組資料的中位數而已。假設兩人,分別到3層樓和8層樓下,在3和8之間取一點,使得到兩個點距離最小,很顯然,在3和8中的每一點到3和8的距離之和都是相等的。推廣到2 3

5 5 6 7 8 8 9這樣一組資料,ans為中位數。

陣列a儲存下標,陣列b儲存相應人數,按b從小到大排序並交換a(或者用結構體),最後的中位數是不對的

1/*2

* mid_value3*/

4//這種方法貌似是對的

5 #include 6 #include 7

using

namespace

std;89

const

int n = 5;10

int num[n+1

];11

12int

solve()

1322

return

left;23}

2425

intmain()

26

三.結束語 

擴充套件問題:往上爬一層要耗費k個單位的能量,往下走耗費1個單位的能亮,只需要計算n1+n2-n3變成n1+n2-n3*k即可。其餘的都是一樣的。

擴充套件問題:2個有序陣列求合併後的中位數,貌似是演算法導論上的,有空再寫……

你讓我安心什麼什麼,說話卻吞吞吐吐,豈非存心讓我不安

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

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

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

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

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

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