問題:電梯在高峰時為了提高效率,當人們進入電梯選擇好樓層後,根據演算法只停在其中的一層。這個演算法要求電梯裡所有的人爬樓梯的總數最少。
想法 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級台階的話,它一共有多少種方法能夠爬到樓梯頂部呢?聰明...