1、問題描述:
某大廈一共有6部電梯,在高峰時間,每層都有人上下,電梯在每層都停,實習生小飛常常會被每層都停的電梯弄的很不耐煩,於是他提出了這樣乙個辦法:由於樓層不太高,每次電梯往上走時,我們只允許電梯停在其中的某一層。所有乘客都從一樓上電梯,到達某層後,電梯停下來,所有乘客再從這裡爬樓梯到自己的目的層。在一樓的時候,每個乘客選擇自己的目的層,電梯自動計算出相應的樓層。電梯應停在哪一層,能夠保證這次乘坐電梯的所有乘客爬樓梯的層數之和最小?
2、
分析:該問題本質上是乙個優化問題,從問題中我們可以看到,影響結果的主要有兩個因素:乘客人數和電梯停的層數。假設樓層總共有n層,電梯停在x層,到第i層的乘客人數為tot[i],則所爬樓梯的總數是:|x-1|*tot[1]+|x-2|*
tot[2]+.....+|x-n|*
tot[n]。我們就是尋找乙個最優的x,使總和最小。
3、解法:
<1>解法一
可以從第一層開始來列舉x,一直到第n層,然後計算出乘客所爬樓梯的總數,並求出最小值以及此時的x的值。這個演算法的時間複雜度為o(n*n)。
#include using namespace std;
void min_floor(int floor_num,int tot_person);//參一:樓層總數;參二:去每層的人數
int main()
; min_floor(6, tot_person);
}void min_floor(int floor_num, int tot_person)
total_floor = 0;
} cout << "目標樓層:" << target_floor << endl << "最少層數:" << minfloor << endl;
}
執行結果:
<2>解法二
假設電梯停在第i層樓,那我們可以計算出所有乘客爬的總樓層數y。如果有n1個乘客目的樓層在i層樓以下,n2個乘客目的樓層在i層樓,n3個乘客在i層樓以上。在這種情況下,如果電梯改停在(i+1)層,那麼目的樓層在i層以上的乘客將少爬一層,即n3個乘客將少爬n3層,目的樓層在i層及i層以下的乘客將多爬一層,及多爬(n1+n2)層,因此所有乘客爬的樓層數為y-n3+n1+n2 = y+(n1+n2-n3)。同理可以求的電梯改停在(i-1)層時,乘客所爬的樓層總數為y-(n1-n2-n3)。由此可見當n1+n2 < n3時乘客少爬的樓層數為n3-n1-n2,電梯在i+1層停更好;如果n2+n3 < n1,乘客少爬的樓層數為n1-n2-n3,電梯停在i-1層更好;其它情況停在i層更好。
根據這個規律我們從第一層開始考察,計算乘客所爬樓梯的總數。然後再根據上面的策略進行調整,直到找到最佳樓層。總的時間複雜度為o(n)。
#include using namespace std;
void min_floor_second(int floor_num, int tot_person);//參一:樓層總數;參二:去每層的人數
int main()
; min_floor_second(6,tot_person);
}void min_floor_second(int floor_num, int tot_person)
for (i = 2; i <= floor_num;i++)
else
break;
} cout << "目標樓層:" << target_floor << endl << "所爬層數:" << min_floor << endl;
}
執行結果:
小飛的電梯排程演算法
程式設計之美 第1.8節 小飛的電梯排程演算法 假設樓層共有n層,電梯停在第x層,要去第i層的乘客數目總數為total i 所爬樓梯的總數就是sum,求使得這個和最小的x的值,即電梯停的樓層數。stop1函式是o n 2 的演算法,就是假設在每層樓停下,計算此時需要爬的樓梯數,如果比最小的少,則賦值...
1 8 小飛的電梯排程演算法
題目 有一棟樓,現在設計一種電梯排程演算法 電梯在一樓讓大家上電梯,然後根據大家選擇要到的樓層算出某一樓層i,電梯在i層停下讓所有人下電梯,然後大家爬樓梯達到自己的樓層。請問電梯停在哪一層,可以使得這一次的所有乘客爬樓層之和最短?一 最直接最簡單的方法就是直接列舉從第一層到最後一層,然後算出電梯停在...
1 8 小飛的電梯排程演算法
題目 有一棟樓,如今設計一種電梯排程演算法 電梯在一樓讓大家上電梯,然後依據大家選擇要到的樓層算出某一樓層i,電梯在i層停下讓全部人下電梯,然後大家爬樓梯達到自己的樓層。請問電梯停在哪一層。能夠使得這一次的全部乘客爬樓層之和最短?一 最直接最簡單的方法就是直接列舉從第一層到最後一層,然後算出電梯停在...