小飛的電梯排程演算法:
1.8問題描述:
小飛是實習程式設計師,下班高峰期時電梯的每層都有人上下,等電梯是件煩人的事情。
小飛有個方案:電梯每次計算裡面的人,和上的樓層,從而統計出在哪一層停,該上樓的出電梯爬樓梯;該下樓的出電梯爬樓梯下去。
問題:電梯停靠在哪一層,能保證這次乘客爬樓梯的層數總和最少?
分析:要算出乘客爬樓梯的層數最少。關鍵就是統計每次做電梯的人數,和樓層的總高度。
現在假設總共有n層,電梯停在第x層,到第i 層的人數為tot[i];
需要走的層數為 sigma;
解法一:從第一層開始計算,用列舉法x到第n層。o(n*n)
int p//p[i],表示到達i層的人數;
int minfloor,targetfloor,floor;
targetfloor=-1;
for(i=1;i<=n;++i)
}return(targetfloor,minfloor);
時間複雜度o(n*n);
解法二:優化演算法 時間複雜度o(n);
現在先規定到達抵達第i層乘客們一共需要爬y層。到達第i層的有x2人,第i層以下x1人,到達第i層以上有x3人;
現在假設電梯在(i-1)層停下來,i層以下的人少走x1層;此時i層以上的人要多爬(x2+x3)層;
所以第(i-1)層停下時:y-x1+x2+x3=y-(x1-x2-x3)
同理在第(i+1)層停下時:多走x1+x2,少走x3 可得 y+x1+x2-x3=y-(x3-x1-x2)
當i層以下的人數比i層以上的人數和第i層人數之和**在(i-1)層停。即x1>x2+x3
那麼當x3>x1+x2時,在第(i+1)層停。
int p//p[i]表示需要在到達第i層的人數
int minfloor,targetfloor;
int x1,x2,x3;
minfloor=0;
targetfloor=1;
for(x1=0,x2=p[1],x3=0,i=2;i<=n;++i)
for(i=2;i<=n;++i){//for迴圈的功能是進行一層一層的列舉,上述那個(x1+x2
光影切割問題
1.7take note
問題描述:在cs遊戲中的破舊倉庫裡。由於光線照射到地面,會形成光亮面和陰暗面。
如現在有三條光線照射在倉庫裡,地面形成了一塊一塊的光暗面,如圖所示:1-8
現在的問題是:在x軸【a,b】的區間內,求出地面被分割的塊數
解決方法:遇到這題,首先是試數,構造出模擬圖,觀察規律。
兩條線,乙個焦點,塊數:4;
三條線,兩個焦點,塊數:6;
三條線,三個焦點,塊數:7;
現在假設有n條線,m個交點;對於每增加一條線,假設就多了m個交點,把這條線分割成(m+1)段,每條線段會將原來的區域分割成兩塊,那麼在原 來的基礎上就多出了就多出了一塊,因此新增了(m+1)塊區域。那麼n條線,m個交點,就分割成(m+n+1)個區域。
回歸到本題,它問的是在區間【a,b】上分割的塊數。可以轉化為找區間【a,b】的交點數。
小飛的電梯排程演算法
程式設計之美 第1.8節 小飛的電梯排程演算法 假設樓層共有n層,電梯停在第x層,要去第i層的乘客數目總數為total i 所爬樓梯的總數就是sum,求使得這個和最小的x的值,即電梯停的樓層數。stop1函式是o n 2 的演算法,就是假設在每層樓停下,計算此時需要爬的樓梯數,如果比最小的少,則賦值...
小飛的電梯排程演算法
1 問題描述 某大廈一共有6部電梯,在高峰時間,每層都有人上下,電梯在每層都停,實習生小飛常常會被每層都停的電梯弄的很不耐煩,於是他提出了這樣乙個辦法 由於樓層不太高,每次電梯往上走時,我們只允許電梯停在其中的某一層。所有乘客都從一樓上電梯,到達某層後,電梯停下來,所有乘客再從這裡爬樓梯到自己的目的...
1 8 小飛的電梯排程演算法
題目 有一棟樓,現在設計一種電梯排程演算法 電梯在一樓讓大家上電梯,然後根據大家選擇要到的樓層算出某一樓層i,電梯在i層停下讓所有人下電梯,然後大家爬樓梯達到自己的樓層。請問電梯停在哪一層,可以使得這一次的所有乘客爬樓層之和最短?一 最直接最簡單的方法就是直接列舉從第一層到最後一層,然後算出電梯停在...