您的位置:首页 > 编程语言

重新开始战斗06-编程之美-电梯调度问题

2014-03-25 09:42 134 查看
问题描述:

一座不高的楼里有一部电梯,为了解决电梯拥挤的问题,电梯的设计者规定每次电梯从一层往上走时,只允许电梯停在其中的某一层。所有的乘客都从一楼上电梯,到达某层楼后,电梯停下来,所有乘客再从这里爬楼梯道自己的目的层。在一楼的时候,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。

学模型:设floor[i]表示第i层要去的人数。target为电梯应该停下的层数。那么该问题的用表达式解释为:



解法一:最低效最直观最简单的算法——每一层每一层的进行计算,即先计算target=1时的情况,然后计算target=2的情况……最后选出最小的。

显然,从target=1到target=N要进行N次计算,每次计算又是一个求和过程。因此,这种算法的时间复杂度为O(N2)。

记住,时间复杂度为O(N2)的算法通常不好

方法二的关键在于利用了数学的方法,因此在我们拿到一个题目的时候,除了考虑传统的贪心策略,动态规划策略……去解决的时候,也应该尝试一下数学的方法,即有没有在数学模型上,存在等效的而又简单的解决办法。

假设电梯停在i层,所有乘客需要的爬的楼梯的总数为Y,那么假设N1个乘客再i层,N2个乘客再i层以下,N3个乘客再i层以上。这个时候如果是停在i-1层,那么总的要爬的楼梯数为Y+N1-N2+N3,如果N1+N3<N2,则应该停在i-1层,然后从i-1层以此类推。如果是停在i+1层,那么总的要爬的楼梯数为Y+N1+N2-N3,如果N1+N2<N3,则应该停在i+1层,然后从i+1层开始以此类推。

因此可以从1层开始计算,依次递增,直到N1+N3>N2,或者从顶层开始,依次递减,直到N1+N2>N3,总之时间复杂度为O(N)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: