博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第1章 游戏之乐——小飞的电梯调度算法
阅读量:6923 次
发布时间:2019-06-27

本文共 2550 字,大约阅读时间需要 8 分钟。

小飞的电梯调度算法

1. 问题描述:

亚洲微软研究院所在的希格玛大厦一共有6部电梯。在高峰时间,每层都有人上下,电梯每层都停。实习生小飞常常会被每层都停的电梯弄的很不耐烦,于是他提出了这样一个办法:

由于楼层并不算太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层。所有乘客从一楼上电梯,到达某层后,电梯停下来,所有乘客再从这里爬楼梯到自己的目的层。在一楼的时候,每个乘客选择自己的目的层,电梯则计算出应停的楼层。

问:电梯停在哪一层楼,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少?

2. 【解法一】暴力求解(枚举法)时间复杂度O(N2)

1 package chapter1youxizhileElevatorScheduling; 2 /** 3  * 小飞的电梯调度算法 4  * 【解法一】枚举法 5  * @author DELL 6  * 7  */ 8 public class ElevatorScheduling1 { 9     private int nPerson[];  //nPerson[i]表示到第i层的乘客数目10     private int nFloor;  //电梯的总层数11     //构造函数12     public ElevatorScheduling1(int[] nPerson, int nFloor){13         this.nPerson = nPerson;14         this.nFloor = nFloor;15     }16     17     public int getTargetFloor(){18         int minFloor = 30*nFloor; //记录爬楼梯总和的最小值,初始时设为一个较大的值19         int targetFloor = -1;  //电梯停的目标层,初始为-120         for(int i=1;i<=nFloor;i++){  //逐个试探i值21             int sum = 0;  //记录爬楼梯的总数和22             for(int j=0;j
sum){26 minFloor = sum;27 targetFloor = i;28 }29 }30 System.out.println("爬楼梯层数的最小值为:"+minFloor);31 return targetFloor;32 }33 public static void main(String[] args) {34 int nPerson[] = {0,1,3,3,4,6,8,4};35 ElevatorScheduling1 es = new ElevatorScheduling1(nPerson, 8);36 System.out.println("电梯的目标层应为:"+es.getTargetFloor());37 38 }39 40 }

 

程序运行结果如下:

爬楼梯层数的最小值为:39电梯的目标层应为:6

 

3.【解法二】动态规划(时间复杂度为O(N))

1 package chapter1youxizhileElevatorScheduling; 2 /** 3  * 小飞的电梯调度算法 4  * 【解法二】动态规划 5  * @author DELL 6  * 7  */ 8 public class ElevatorScheduling2 { 9     private int nPerson[];  //nPerson[i]表示到第i层的乘客数目10     private int nFloor;  //电梯的总层数11     //构造函数12     public ElevatorScheduling2(int[] nPerson, int nFloor){13         this.nPerson = nPerson;14         this.nFloor = nFloor;15     }16     17     /**18      * 计算目标层19      * @return 目标层20      */21     public int getTargetFloor(){22         int minFloor = 0; //记录爬楼梯总和的最小值23         int targetFloor = -1;  //电梯停的目标层,初始为-124         int i;25         int N1; //第i层以下的乘客数目26         int N2; //第i层的乘客数目27         int N3; //第i层以上的乘客数目28         //计算第一层的N1,N2,N3值29         N1 = 0;30         N2 = nPerson[0];31         for(N3=0,i=1;i

程序运行结果如下:

爬楼梯层数的最小值为:39电梯的目标层应为:6

 扩展问题:

  往上爬楼梯,总是比往下走要累的。假设往上爬一个楼层,要耗费k单位的能量,而往下走只需要耗费1单位的能量,那么如果题目条件改为让所有人消耗的能量最少,这个问题怎么解决呢?

 【解法一】暴力求解(枚举法)时间复杂度O(N2)

只需将上述【解法一】中的

22             for(int j=0;j

改为:

int j;            for(j=0;j

  【解法二】动态规划(时间复杂度为O(N))

只需将上述【解法二】中的

31         for(N3=0,i=1;i

改为:

for(N3=0,i=1;i

 

转载地址:http://zkecl.baihongyu.com/

你可能感兴趣的文章
jquery的性能优化
查看>>
谈谈持续集成,持续交付,持续部署之间的区别
查看>>
UICollectionView 头视图、 尾视图以及Cell自定制
查看>>
Centos中yum方式安装java
查看>>
for loop
查看>>
Linux常用命令详解(一) -- 处理目录常用命令
查看>>
指针变量的星号是靠近变量名还是靠近类型
查看>>
在线程中执行代码
查看>>
POJ 2299 Ultra-QuickSort【树状数组+离散化】
查看>>
神经网络损失函数公式解读
查看>>
Android Studio插件:PlantUML
查看>>
Nginx开发从入门到精通
查看>>
Jenkins配置手动发版
查看>>
横向图片轮播(如果一个项目里面只需用这一次,可以用这个插件,多次则不建议使用)...
查看>>
计算机存储单位KB,MB,GB,TB,PB,EB,ZB,YB后面是什么?
查看>>
python 基础笔记十九 - 面向对象
查看>>
Linux安全之——Ubuntu的iptable命令使用
查看>>
entOS7查看开放端口命令
查看>>
操作系统位数
查看>>
关于call()的this指向研究
查看>>