[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层时,要考虑的问题增多,涉及到动态规划,可能。主要是求得什么样的划分是最好的。
[程序]-
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
相关文章推荐
- [TB-Exam]求命中率的一个题
- 编程之美---小飞的电梯调度问题 1.8 扩展2
- N层电梯只停一层情况下,求所有人爬楼层数最少
- 小飞的电梯调度法
- 编程之美1.8小飞的电梯调度算法扩展问题
- 【原创】编程之美---小飞的电梯调度问题 (停k层的解法)
- 高人请进:请教如何实现在CTreeCtrl中的项目可以通过拖曳(drag)来改变排序(暂时只考虑一层节点)
- Tibco Software Inc TB0-108 Exam
- 编程之美:小飞的电梯调度(k次停留)
- Tibco Software Inc TB0-108 Exam
- 软件工程课堂练习——N层电梯只停一层求乘客爬楼层数最少(基本方法+优化方法)
- No property month found for type **TbExamResult**!
- 编程之美--游戏之乐--1.8小飞的电梯调度问题
- 编程之美-小飞的电梯调度算法另一种解
- 编程之美:小飞的电梯调度
- 编程之美---小飞的电梯调度问题 (停k层的解法) (正在怀疑该解法的正确性)
- 编程之美--1.8--小飞的电梯调度问题--扩展问题--2--(M层电梯选择K层停靠)
- 覆盖上一层普通的眼膜
- 无法使用 SELECT INTO 语句向表 '#tb' 中添加标识列,该表中已有继承了标识属性的列 'ID'
- memmove函数如何考虑内存重叠的