小飛的電梯調度算法,光影切割問題

小飛的電梯調度算法:

1.8問題描述:

小飛是實習程序員,下班高峯期時電梯的每層都有人上下,等電梯是件煩人的事情。

小飛有個方案:電梯每次計算裏面的人,和上的樓層,從而統計出在哪一層停,該上樓的出電梯爬樓梯;該下樓的出電梯爬樓梯下去。

問題:電梯停靠在哪一層,能保證這次乘客爬樓梯的層數總和最少?


分析:

要算出乘客爬樓梯的層數最少。關鍵就是統計每次做電梯的人數,和樓層的總高度。

現在假設總共有N層,電梯停在第x層,到第i 層的人數爲Tot[i];

需要走的層數爲 sigma{Tot[i]*|x-i|};


解法一:從第一層開始計算,用枚舉法x到第N層。O(N*N)

int  p[]//p[i],表示到達i層的人數;
int MinFloor,TargetFloor,Floor;
TargetFloor=-1;
for(i=1;i<=N;++i){
    Floor=0;
    for(j=1;j<i;++j)
        Floor=p[j]*(i-j);
    for(j=i+1;j<=N;++j)
        Floot=p[j]*(j-i);
    if(TargetFloor==-1||MinFloor>Floor){
        TargetFloor=i;
        MinFloor=Floor;
    }
    
}
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){//求出第i層,總共需要走Y層
    x3+=p[i];
    MinFloor+=p[i]*(i-1);
    }
for(i=2;i<=N;++i){//for循環的功能是進行一層一層的枚舉,上述那個(x1+x2<x3),
                                //選用第i+1層停。
    if(x1+x2<x3){
        MinFloor+=x1+x2-x3;
        x1+=x2;
        x2=p[i];
        x3-=p[i];
    }
    break;
}
return(TargetFloor,MinFloor);


光影切割問題

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】的交點數。






發佈了26 篇原創文章 · 獲贊 38 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章