程式設計之美 爬樓梯問題

2021-07-09 16:14:35 字數 2568 閱讀 4228

問題:電梯在高峰時為了提高效率,當人們進入電梯選擇好樓層後,根據演算法只停在其中的一層。這個演算法要求電梯裡所有的人爬樓梯的總數最少。

想法 i:算是窮舉法吧,把每個人可能會爬的樓層數都計算出來,然後逐一求和後,再找出和最小的值。

假設有10層樓,5個人分別到3,6,9,10,5 層,窮舉一下可以得到

2  5  8  9  4   = 28

停在第 1   層爬樓的總數

1  4  7  8  3   = 23

停在第 2   層爬樓的總數

0  3  6  7  2   = 18

停在第 3   層爬樓的總數

1  2  5  6  1   = 15

停在第 4   層爬樓的總數

2  1  4  5  0   = 12

停在第 5   層爬樓的總數

3  0  3  4  1   = 11

停在第 6   層爬樓的總數

4  1  2  3  2   = 12

停在第 7   層爬樓的總數

5  2  1  2  3   = 13

停在第 8   層爬樓的總數

6  3  0  1  4   = 14

停在第 9   層爬樓的總數

7  4  1  0  5   = 17        停在第 10 層爬樓的總數

這裡可以看出:到第6層停是可以滿足要求的。

**:測試 假設一共有5個人分別去 3,6,9,10和5層

#include using namespace std;

#define people 5

#define floors 10

#define max 50

int arrtarget[people] = ;

int arrresult[floors][people];

int arrclmib[floors];

void print(int arr[floors][people])

cout << " = " << arrclmib[i]<< endl;

}}void scan()

if (nmin > arrclmib[i])

}print(arrresult);

cout << "\n****************************************" << endl;

cout << "stop at: floor " << nminindex+1 << " clmib = " << nmin << endl;

}void main()

測試結果:2  5  8  9  4   = 28

1  4  7  8  3   = 23

0  3  6  7  2   = 18

1  2  5  6  1   = 15

2  1  4  5  0   = 12

3  0  3  4  1   = 11

4  1  2  3  2   = 12

5  2  1  2  3   = 13

6  3  0  1  4   = 14

7  4  1  0  5   = 17

****************************************

stop at: floor 6   clmib = 11

複雜度為 o(n*n)

想法 ii:利用你多爬一層我就少爬一層的關係,找乙個最優的解。

假設就三層樓 i-1,  i,  i+1,到i-1層總共會爬n1層,到i層會爬n2,到 i+1會爬n3

如果電梯停在i-1層,那麼也就有n1層的樓不用爬了。總數也就 y

-n1+n2+n3

如果電梯停在i+1層,那麼也就有n3層的樓不用爬了。總數也就 y+n1+n2

-n3如果n1 > n2+n3那一定是停在i-1層合適,減去的樓層多了

如果n3 > n1+n2那一定是停在i+1層合適,減去的樓層多了

這樣得到了演算法ii,先算出所有的要爬的樓層的總和,在按上面的計算方式每層向上計算。

**:測試 

假設一共有5個人分別去 3,6,9,10和5層

這裡arrfloorpeople的數字表示到每一層的人數。

#include using namespace std;

#define floors 10

int arrfloorpeople[floors] = ;

void calc(int &nfloors, int& nfloorindex)

for (i = 2; i < floors; i++)

測試結果:

stop at: floor 6   clmib = 11

複雜度為 o(n)

爬樓梯問題

ok,前段時間在一篇blog上看到乙個關於樓梯的面試題,大概內容如下 現有乙個人,規定他上樓梯時只能一步走乙個台階或者兩個台階。要求 給定任意樓梯的階數,求共有多少種方法爬完樓梯。如果有經驗可以看出,這是一道遞迴的題目。不過這個遞迴 程式怎麼寫呢?我的思路是可以這樣想,不管他前面 怎麼爬,最後總是要...

爬樓梯問題

爬樓梯問題,每次可以走1步或者2步,爬上n層樓梯的總方法,這題就是乙個變相的fibonacci問題。當n 1時,有1種方法,即直接走1步 當n 2時,有2方法 連續走2步,或直接走兩步 對於n,設f n 為總方法,則 f n f n 1 f n 2 ps f n 1 即第一次走一步的走法,f n 2...

爬樓梯問題

蒜頭君自從春節回來以後,體重就像加了特技一樣duang duang 地暴增起來。於是小蒜頭打算每天爬樓梯來燃燒體內的脂肪 咦?蒜怎麼會有脂肪 蒜頭在爬樓梯的時候腦洞大開,因為蒜頭腿短,爬樓梯的時候一次只能邁1級或2級台階,它就想到了,假如一共有n級台階的話,它一共有多少種方法能夠爬到樓梯頂部呢?聰明...