这是《编程之美》中的一道题,刚开始题目比较简单,但是逐步推进之后的问题也有些难度,这样由简单到难的一步步深入的思想比较值得学习。
最初的问题
假如电梯在高峰期间只允许在某一层停留,所有的乘客在一楼上电梯,到达某层后,所有乘客从电梯下来,到达自己要去的楼层,在一楼的时候所有乘客选出自己要去的楼层,电梯根据所有乘客选择的楼层信息得出要停留的楼层。
那么,电梯停留在那一层,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少。
问题的分析和解法
该问题本质上是一个优化问题,首先为则个问题找到一个合适的抽象模型。从问题中可以看出,有两个因素会影响到最后的结构:乘客的数目即需要停留的楼层,因此,我们可以从统计到达各层的乘客数目开始分析。
假设楼层总共有N层,电梯停留在X层,要去第i层的乘客总数目是Tot[i],这样,所爬楼梯的总数就可以表示出老。
因此,我们就是要找到一个整数X使得这个总数的值最小。
解法
首先思考简单解法,可以从第1层开始枚举X一直到第N层,然后再计算出如果电梯在第X层的话,所有乘客总共需要爬多少层楼。这是最为直接的一个解法。可以看出,这个算法需要两重循环来完成计算
int n=0;//这个表示电梯所在的最高楼层
int nPerson[] = new int[n+1];//这个数组表示要去每一层的乘客数
//上面的两个变量应该是给出的,这里只是示意代码没有初始化。
int nFloor,nMinFloor,nTargetFloor;//分别表示电梯停在第n层时候的结果,目前为止的最小结果,最小结果所停的楼层。
nTargetFloor = -1;//考虑到初始化最小结果和最小结果所砸的楼层,所以先设定为一个非法值