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