您的位置:首页 > 其它

[TB-EXAM]小飞电梯-停一层(暂未考虑停N层)

2009-10-16 18:13 309 查看
电梯有N层,从底层到第i层的人有iFloorPassengerNum[i]个人,电梯只能停一次的话,求停那一次是的步行的层数最少。从下往上依次考察停某层的话,是Y-(NAbove-NFloor-NBottom)达到最小值,
NAbove指到改层的人数,
NBottom是该层停时到其以下层所有的人应该步行的层数,NAbove则是之上的。
最底层初始化这些数据,然后每考察一层时,其上每个人就少走一层,其下的每个人就多走一层,新到的一层为到该层的人数。
但NAbove<NFloor+Nbottom时候即是过了V的谷底,之前的得出的几位最小层数和该停的楼层。但可以停K层时,要考虑的问题增多,涉及到动态规划,可能。主要是求得什么样的划分是最好的。

[程序]-

]/*******************************************************************
*
*    DESCRIPTION: Elevator Optimize Problem
*
*    AUTHOR: Neesky
*
*    DATE:2009-10-13
*
*******************************************************************/
/*Marcor Definition*/
#define FLOORSNUM 9
/*include files*/
#include <iostream>
using namespace std;
/*Global Definition*/
int iFloorPassengerNum[FLOORSNUM]={0,4,4,5,3,2,2,1,3};/*每层乘客的数目-总共9层*/
/// <summary>
/// Just For Show the Array
/// </summary>
/// <param name="Arr"></param>
/// <param name="N"></param>
/// <returns></returns>
void OutputArray(int *Arr, int N)
{
for(int i=N-1;i>=0;--i)
cout<<"/n       "<<Arr[i]<<"      ->No."<<i+1<<"F";
cout<<endl;
return;
}
/// <summary>
/// 求出在第I层停的所有情况下的WalkLayers,也是O(N)时间复杂度
/// </summary>
/// <param name="_iFloorPassengerNum"></param>
/// <param name="N"></param>
/// <returns></returns>
void StopAtOnlyOneFloor_AllFloorWalkLayers(int *_iFloorPassengerNum, int N)
{
cout<<"/n/nTotal Walks Numbers (All)  : ";
int NBottom=0,NFloor=_iFloorPassengerNum[0],NAbove=0,minWalkLayer=0;
for(int i=1; i<N; ++i)
{
NAbove+=_iFloorPassengerNum[i];
minWalkLayer=minWalkLayer+(_iFloorPassengerNum[i]*i);
}
cout<<"/n       "<<_iFloorPassengerNum[0]<<"      ->No.1F     -> "<<minWalkLayer<<"Fs";
for(int i=1; i<N; ++i)
{
NAbove=NAbove-_iFloorPassengerNum[i];
NBottom=NBottom+NFloor;
NFloor=_iFloorPassengerNum[i];
minWalkLayer=minWalkLayer-NFloor-NAbove+NBottom;
cout<<"/n       "<<_iFloorPassengerNum[i]<<"      ->No."<<i+1<<"F     -> "<<minWalkLayer<<"Fs";
}
cout<<endl;
return;
}
/// <summary>
/// If elevator only stop at one station, and for the walking fewest layers. O(n)
/// Consider it from 1st Floor,NBottom:the bottom floors,NFloor:the floor NAbove:the above floor
/// </summary>
/// <param name="_iFloorPassengerNum"></param>
/// <param name="N"></param>
/// <returns></returns>
void StopAtOnlyOneFloor_FewestWalkLayer(int *_iFloorPassengerNum,int N)
{
cout<<"/n**Floor Passengers Numbers: ";
OutputArray(_iFloorPassengerNum,N);
int NBottom=0, NFloor=_iFloorPassengerNum[0], NAbove=0,minWalkLayer=0;
for(int i=1; i<N; ++i)  //Consider from 1st Floor:i=0
{
NAbove+=_iFloorPassengerNum[i];
minWalkLayer=minWalkLayer+(_iFloorPassengerNum[i]*i);
}
int j=1;
for(;j<N;++j)/*Consider Stop At Above Floor: from j=1(The 2nd Floor)*/
{
if(NAbove<NFloor+NBottom)break;/*Key,Passed the V's bottom,StopAtOnlyOneFloor_AllFloorWalkLayers不同的地方*/
NAbove=NAbove-_iFloorPassengerNum[j]; /*Up to the No.j+1 floor*/
NBottom=NBottom+NFloor;
NFloor=_iFloorPassengerNum[j];
/*To get V's bottom*/
minWalkLayer=minWalkLayer-NAbove-NFloor+NBottom;/*Uppper Less 1 layer, Now and Bottom more 1 layer*/
}
cout<<"**Best Stop is(FewestWalks): ->No."<<j<<"F, TotalWalks->"<<minWalkLayer<<"Fs "<<endl;
return;
}
/// <summary>
///
/// </summary>
/// <param name="argc"></param>
/// <param name="argv"></param>
/// <returns></returns>
int main (int argc, char *argv[])
{
StopAtOnlyOneFloor_AllFloorWalkLayers(iFloorPassengerNum,FLOORSNUM);
StopAtOnlyOneFloor_FewestWalkLayer(iFloorPassengerNum,FLOORSNUM);
return(0);
}


Total Walks Numbers (All)  :

0      ->No.1F     -> 92Fs

4      ->No.2F     -> 68Fs

4      ->No.3F     -> 52Fs

5      ->No.4F     -> 44Fs

3      ->No.5F     -> 46Fs

2      ->No.6F     -> 54Fs

2      ->No.7F     -> 66Fs

1      ->No.8F     -> 82Fs

3      ->No.9F     -> 100Fs

**Floor Passengers Numbers:

3      ->No.9F

1      ->No.8F

2      ->No.7F

2      ->No.6F

3      ->No.5F

5      ->No.4F

4      ->No.3F

4      ->No.2F

0      ->No.1F

**Best Stop is(FewestWalks): ->No.4F, TotalWalks->44Fs
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: