題目:
亞洲微軟研究院所在的希格瑪大廈一共有6部電梯。在高峰時間,每層都有人上下,電梯每層都停。實習生小飛常常會被每層都停的電梯弄的很不耐煩,於是他提出了這樣乙個辦法:
由於樓層並不算太高,那麼在繁忙的上下班時間,每次電梯從一層往上走時,我們只允許電梯停在其中的某一層。所有乘客從一樓上電梯,到達某層後,電梯停下來,所有乘客再從這裡爬樓梯到自己的目的層。在一樓的時候,每個乘客選擇自己的目的層,電梯則計算出應停的樓層。
問:電梯停在哪一層樓,能夠保證這次乘坐電梯的所有乘客爬樓梯的層數之和最少?
方法一:暴力列舉,時間複雜度o(n^2)
用陣列nperson[i]存放在第i層下樓的人數,在不同的i層停靠,求所有人需要走的樓層總和,找出總和最小的樓層target,輸出。用兩重迴圈完成計算。
1/*2方法二:時間複雜度為o(n)的動態規劃的演算法* 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 }
降低時間複雜度,求解。假設停在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部電梯。在高峰時間,每層都有人上下,電梯每層都停。實習生小飛常常會被每層都停的電梯弄的很不耐煩,於是他提出了這樣乙個辦法 由於樓層並不算太高,那麼在繁忙的上下班時間,每次電梯從一層往上走時,我們只允許電梯停在其中的某一層。所有乘客從一樓上電梯,到達...