重新开始战斗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)。
一座不高的楼里有一部电梯,为了解决电梯拥挤的问题,电梯的设计者规定每次电梯从一层往上走时,只允许电梯停在其中的某一层。所有的乘客都从一楼上电梯,到达某层楼后,电梯停下来,所有乘客再从这里爬楼梯道自己的目的层。在一楼的时候,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。
学模型:设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)。
相关文章推荐
- 一口一口吃掉struts(七)——ActionForward知多少 .
- 第四周作业 多线程编程
- Java第四周作业
- (翻译)Java SE 8 Lambda 标准库概览(上)
- PHP调用sqlserver存储过程并获取返回值
- new/delete与malloc/free都干了哪些事
- JDK安装及开发环境部署
- 第四周实验
- Python hashlib模块 (主要记录md5加密)
- python使用循环实现批量创建文件夹示例
- C++中数据对齐问题。struct、union、enum,类继承。再谈sizeof()
- Python hashlib模块 (主要记录md5加密)
- Java中的类装载机制、反射机制、JDK5.0版本新加入一些特性
- python closure
- java实现有条件字符串全排列输出
- Python基础教程第九章--------多么痛的领悟
- SMTP命令与ESMTP命令简介(附带命令通信)
- 如何恢复Eclipse或者Myeclipse里面删除的文件?
- 一步一步学SpringDataJpa——初识SpringDataJpa
- C++编程练习(1)----“实现简单的线性表的顺序存储结构“