程式設計之美電梯排程問題
電梯排程問題:亞洲微軟研究院所在的希格瑪大廈一共有6部電梯。在高峰時間,每層都有人上下,電梯每層都停。實習生小飛常常會被每層都停的電梯弄的很不耐煩,於是他提出了這樣一個辦法:
由於樓層並不算太高,那麼在繁忙的上下班時間,每次電梯從一層往上走時,我們只允許電梯停在其中的某一層。所有乘客從一樓上電梯,到達某層後,電梯停下來,所有乘客再從這裡爬樓梯到自己的目的層。在一樓的時候,每個乘客選擇自己的目的層,電梯則計算出應停的樓層。
問:電梯停在哪一層樓,能夠保證這次乘坐電梯的所有乘客爬樓梯的層數之和最少?
電梯排程問題本質上等同於一維郵局問題。
如果記上到樓層1,2,3,4....N的人數分別為a[1],a[2], a[3], a[4]... a[N]
此問題實際上是
MIN(sigma{ a[i] |i-x|} )
sigma為和函式, x為電梯停的樓層。
那麼由帶權中位數演算法可以快速求出最優樓層x。演算法複雜度為O(N)
如果資料記錄是樓層和人數的陣列,而且資料中的不同樓層數目為n, 而且陣列中權重為0(人數為0)的樓層我們可以刪除,比如總共有5層樓,1,2,3,4,5 樓的人數分別為4,2,0,0,3
那麼我們可以刪除陣列中權重為0的樓層3和4,得到的新陣列為[1,2,5],對應的權重陣列為[4,2,3], 那麼此時的N=5,n=3
由選擇帶權中位數演算法複雜度可知,此複雜度為O(n)
如果n比N小很多,演算法的效能O(n)將大大優於程式設計之美上給出的複雜度為O(N)的演算法。
複雜度為O(n)的帶權中位數演算法見前一篇文章。
相關推薦
程式設計之美---電梯排程演算法
在看linux 0.11版本的塊裝置驅動部分,裡面提到了電梯演算法,總結下幾種尋道的方式。 第一種:最為原始的先到先服務(first come first served)的演算法。假設此時我們正在第11道讀取資料,然後陸陸續續有其他程序來要求我們提供磁碟內容
程式設計之美電梯排程問題
電梯排程問題:亞洲微軟研究院所在的希格瑪大廈一共有6部電梯。在高峰時間,每層都有人上下,電梯每層都停。實習生小飛常常會被每層都停的電梯弄的很不耐煩,於是他提出了這樣一個辦法: 由於樓層並不算太高,那麼在繁忙的上下班時間,每次電梯從一層往上走時,我們只允許電梯停在其中的
程式設計之美之小飛的電梯排程演算法(多種解法)---Java語言
1.題目情景 我們假設都是從一樓上電梯的,而至於訊電梯停在其中的某一層。即所有的乘客都從一樓上電梯,到達某層之後,電梯停下來,所有乘客再從這裡爬樓梯到自己的目的層。在一樓的時候,每個乘客選擇自己的目的層,電梯則自動計算出應停的樓層,並且能夠保證該層停使得所有
《程式設計之美》小飛的電梯排程演算法
亞洲微軟研究院所在的希格瑪大廈一共有6部電梯。在高峰時間,每層都有人上下,電梯每層都停。實習生小飛常常會被每層都停的電梯弄的很不耐煩,於是他提出了這樣一個辦法: 由於樓層並不算太高,那麼在繁忙的上下班時間,每次電梯從一層往上走時,我們只允許電梯停在其中的某一層
程式設計之美 1.8小飛的電梯排程演算法的第三種解
原題目如下: 亞洲微軟研究院所在的希格瑪大廈一共有6部電梯。在高峰時間,每層都有人上下,電梯每層都停。實習生小飛常常會被每層都停的電梯弄的很不耐煩,於是他提出了這樣一個辦法: 由於樓層並不算太高,那麼在繁忙的上下班時間,每次電梯從一層往上走時,我們只允許電梯停在其中的某
程式設計之美--遊戲之樂--1.8小飛的電梯排程問題
o(n)解法 利用Y來儲存以當前i層為基準,所有員工需要走的樓層 N1 i層以下所有人數 N2 第i層的人數 N3 i層以上的人數 可以得出: Y = Y(i-1需要走的樓層)+N1-N2
小飛的電梯排程演算法@程式設計之美
題目:(程式設計之美 1.8)一棟樓有6層,現在設計一種電梯排程演算法:電梯在一樓讓大家上電梯,然後根據大家選擇要到的樓層算出某一樓層i,電梯在i層停下讓所有人下電梯,然後大家爬樓梯達到自己的樓層。請問電梯停在哪一層,可以使得這一次的所有乘客爬樓層之和最短? 思路: 1、暴
《程式設計之美》讀書筆記之[小飛電梯排程演算法]
在高峰時間,實習生小飛常常會被電梯每層樓都停弄得很不耐煩,於是他想出了這樣一個辦法:由於樓層並不高,那麼在繁忙的時間,每次電梯從一層往上走時,我們只允許電梯停在其中的某一層。所有乘客都從一樓上電梯,到達某層樓後,
程式設計之美1.8小飛的電梯排程演算法擴充套件問題
設有N2個乘客在第i層下,N1個乘客的目的地樓層在第i層以下,N3個乘客的樓層在第i層以上 假設電梯從停在i層改停在為i+1層,停在第i層時消耗的總能量為E 則改為i+1層停之後原先i層以上的乘客即N3個乘客少往上爬一層,原先第i層的N2個乘客需多往下爬一層,原先第i層以下
程式設計之美——一摞烙餅的排序(暴搜+剪枝)
題目 分析 深度優先搜尋遍歷每一種情況,去翻轉次數最小的,當然,還要加一些剪枝,畢竟O(nn)的時間複雜度。 程式碼 C風格 1 /**** 字首排序 ****/ 2 #include<stdio.h> 3 #include<cstring> 4 #incl
程式設計之美10:計算字串的相似度
我們並不在乎兩個字串變得相等之後的字串是怎樣的,所以 1.一步操作之後,再將A[2,…,lenA]和B[1,…,lenB]變成相同的字串。 2.一步操作之後,再將A[1,…,lenA]和B[2,…,lenB]變成相同的字串。 3.一步操作之後,再將A[2,…,lenA]和B[2,…,lenB]變成相
程式設計之美9:陣列迴圈位移
1: RightShift(int *arr, int N, int K) { K %= N; while (K--) { int t = arr[N - 1]; for (int i = N - 1; i > 0; i--)
程式設計之美8:求陣列的子陣列之和的最大值
1: int MaxSum(int *A, int n) { int maximum = -INF; int sum; for (int i = 0; i < n; i++) { sum = 0; for (int j = i;
程式設計之美7:最大公約數
1:輾轉相除法 f(x,y) = f(y, x%y); int gcd(int x, int y) { return (!y) ? x : gcd(y, x % y); } 2:對於大整數,取模運算非常昂貴。 f(x, y) = f(x-y, y); BigInt gcd(BigI
程式設計之美3:求二進位制數中1的個數
1: int Count(BYTE v) { int num = 0; while (v) { if (v % 2 == 1) { num++; } v = v / 2; }
程式設計之美2:程式只用一個位元組變數,列印將帥位置
原創:https://blog.csdn.net/ndzjx/article/details/84404320 #include <stdio.h> #include <windows.h> #include <time.h> #include <
程式設計之美1:CPU列印直線,曲線
原創:https://blog.csdn.net/ndzjx/article/details/84404268 1:本質:每次迴圈的CPU比例問題。 CPU排程時間片,大約為20ms 2.2GHz是CPU時鐘週期,= 22億次 = 2.2*10^9 每個時鐘週期平均執行2條彙編指令
程式設計之美4:階乘相關
1)N!末尾有多少個零 N! = K * 10^M N! = 2^X * 3^Y * 5^Z M = min(X,Z) 其中X >= Z,因為能被2整除的數出現的頻率比能被5整除的數高很多。 於是只需計算因式分解中5的指數。 1: ret = 0; for (int i = 1; i <
併發程式設計之美,帶你深入理解java多執行緒原理
1.什麼是多執行緒? 多執行緒是為了使得多個執行緒並行的工作以完成多項任務,以提高系統的效率。執行緒是在同一時間需要完成多項任務的時候被實現的。 2.瞭解多執行緒 瞭解多執行緒之前我們先搞清楚幾個重要的概念! 如上圖所示:對我們的專案有一個主記憶體,這個主記憶體裡面存放了我們的共享變數、方法區、堆中的物件等
程式設計之美-1.3-烙餅排序問題
問題描述: 烙餅問題可以簡化為對一段由n個無重複的整陣列成的無序陣列a[n]進行排序。排序要求每次只能對a[0]~a[i]部分的陣列進行翻轉(0 < i < n),最終完成排序。 輸入:陣列大小n;n個整數。 輸出:最小遞迴查詢次數m;每次翻轉位置j