编程之美-电梯调度算法

大部分参考文章http://www.cppblog.com/jake1036/archive/2011/06/29/149720.html(将它的c语言改写成了java版)

一问题描述:
     所有的员工均在1楼进电梯的时候,选择所要到达的楼层。
     然后计算出停靠的楼层i,当到达楼层i的时候,电梯停止。
     所有人走出电梯,步行到所在的楼层中。
     求所有人爬的楼层数目和的最小值。 
 
二 问题解决方法:
   解决方案:
  (1)使用简单的方法,直接将楼层从1到n开始遍历
       sum(person[i] *  |i - j| ) 此表达式为一个双重循环,i与j均为1-n的循环。 
       j下标表示电梯停靠的楼层。 
       person数组表示,对应i层的下电梯的人数。此算法负责度为o(n*n) 
       对应的j是上述和为最小的一层即为所求。 上面的算法复杂度为o(n) 
       
  (2)下面考虑一个简单的算法,使其复杂度达到o(n)
      考虑假如电梯停靠在某一楼层i处,假设在i处下楼的客人为N2,
      在i以上楼层的客人数目为N3 ,在i一下楼层的客人数目为N1。 
      且将电梯在i层停止时,全部人员的路程之和记为T。 
      
      那么加入电梯在i-1层停的话,则原来i层之上的人需要多爬一层,即增加了N3
      第i层的人需要多爬一层,则结果增加了N2,  i层之下的人则少爬了一层,结果减去N1
      所以第i-1层的结果为 T - N1 + N2 + N3 。即结果可以即为 T -(N1 - N2 - N3) 
      
      
      下面考虑在i+1层的结果,若电梯在i+1层停止的话,原来i层之上的客户都会少爬一层,
      则结果减少N3 ,而i层之下的人员则都会多爬一层即增加了N1 ,第i层的人员都会多爬一层
      即为增加了N2 。则结果为 T + N1 + N2 - N3 
        
      综上我们得出,
      (1)若N1 > N2 + N3的时候, 我们在第i-1层 选择电梯停止最好。
      (2)若N1 + N2 < N3的时候, 我们选择在第i+1层停止电梯最好。  
        
      下面我们可以先计算出来当i=1时候的T ,然后判断是否需要在i+1层停止,若是i+1层的花费
       大于i层,则我们可以继续计算,否则退出。

三 代码如下:

public class DianTi
{static final int N = 10 ;static int person[] = {0, 2, 5 , 7 , 3 , 5 , 2 , 6, 2 , 6 , 3}; public static void main(String[] args){System.out.print(compute(person)+" "+compute2(person));}public static int compute(int[] person){//先计算出在第一层停止的时候 所需要的花费int T = 0;int N1 = 0 ; //在第一层以下下的人数 int N2 = person[1] ; //在第一层处下的人数 int N3 = 0 ;      //在第一层之上下电梯的人数 int floor =  1 ;for(int i = 2 ; i <= N ;i++) //先计算出第1层停止需要爬取的楼层数目 {T  += person[i] * (i - 1) ;N3 += person[i] ;     }for(int i = 2 ; i <= N ;i++){if(N1 + N2 <= N3) //说明第i+1层的结果会大于第i层 {T += N1 + N2 - N3 ;N1 += N2 ;N2 = person[i] ; N3 -= person[i] ;floor = i ;}     else  //否则第i层的结果已经最小,故不需要计算第i+1层 break ; }     return floor ;}public static int compute2(int[] person){int tempfloor = 0 ;int min = 6553 ;//存储最小值int floor = 1   ;//存储停靠的楼层 int j;for(int i = 1 ; i <= N ;i++) //表示第i楼层电梯停靠 {tempfloor = 0 ;         for(j = 1 ; j < N ;j++)      tempfloor += Math.abs((i - j)) * person[j] ;         if(min > tempfloor)   {min = tempfloor ;floor = i ;          }                                       }return floor ;   }
}

结果如下:

5 5

编程之美---电梯调度算法相关推荐

  1. 编程之美-电梯调度算法方法整理

    [试题描述] 方法一:时间复杂度O(n^2) 方法二:时间复杂度O(n)

  2. 操作系统:电梯调度算法代码演示

    实验内容 一.实验目的 任何一个对磁盘的访问请求,应给出访问磁盘的存储空间地址:柱面号.磁头号和扇区号.在启动磁盘执行I/O操作时,应先把移动臂移动到指定的柱面,再等待指定的扇区旋转到磁头位置下,最后 ...

  3. 编程之美----小飞的电梯调度算法

    原帖地址:http://blog.csdn.net/li4951/article/details/7486092 亚洲微软研究院所在的希格玛大厦一共有6部电梯.在高峰时间,每层都有人上下,电梯每层都停 ...

  4. 编程之美 1.8 小飞的电梯调度算法

    小飞的电梯调度算法 电梯是我们每天都要坐的,上班高峰期是非常拥挤的,大家都不想每层都停,决定选择一层停,剩下的楼层大家自己爬.假设电梯共有N层,坐电梯的人有M人,每个人都有自己的目的层,现在让你设计一 ...

  5. 小飞的电梯调度算法,光影切割问题编程之美

    小飞的电梯调度算法: 1.8问题描述: 小飞是实习程序员,下班高峰期时电梯的每层都有人上下,等电梯是件烦人的事情. 小飞有个方案:电梯每次计算里面的人,和上的楼层,从而统计出在哪一层停,该上楼的出电梯 ...

  6. c语言 电梯调度,c语言函数如何返回两个值或多个值(结合 小飞 电梯调度算法)...

    正常思维:使用return 语句,但每调用一次函数 return 语句只能返回一个值 .这是C语言语法规则. 该怎么实现一个函数返回两个值或是多个值?,可以采用"间接方法".大概有 ...

  7. 读书问题之《编程之美》 -----12061161 赵梓皓

    我阅读的书是<编程之美> 刚开始的时候阅读序,就觉得控制cpu利用率这个问题很好玩,所以重点看了这部分和解决办法,问题也都大部分是这部分的.那么问题就来了(挖掘机技术xxx?中国山东找蓝翔 ...

  8. 电梯调度算法 软工 Pair Project

    软工要求的结对编程,随机分组,然后,我(郭立轩)和六班的闫生辉分在了同一组.之前并不认识,虽然如此,这次结对编程的经历还是相当愉快的,也学到了不少东西. OK,下面进入正文 关于结对编程 如何利用结对 ...

  9. 利用普普通通的游戏引擎实现普普通通的电梯调度算法

    注:这是目前WebGL2.0支持的浏览器版本号列表 稀疏 如同在那个慵懒的午后,贴心地给你指出你代码块的错误的主程老大的头发 WebGL2.0这目前稀疏的浏览器支持,着实令人唏嘘,不过我们要说的不是W ...

  10. 比赛报名 | 2019AIIA杯电梯调度算法大赛正式启动

    由中国人工智能产业发展联盟主办.百度深度学习平台飞桨(PaddlePaddle)承办的2019AIIA杯人工智能巡回赛-百度赛站(以下简称"大赛")将于7月至10月举行.本届大赛围 ...

最新文章

  1. 磁盘加密软件TrueCrypt知识大全(二)之创建文件型加密卷
  2. 盘点 HashMap 源码中的那些优雅的设计!
  3. ++,--运算符的使用
  4. 【原创】贴片电容的测量方法。。。这是我从自己QQ空间转过来的,本人实操!...
  5. qq安全保护进程更改计算机,分享win10电脑系统关闭qq安全防护进程的步骤
  6. 前端学习(1614):oracle数据库管理
  7. JEEWX捷微企业号管家系统发布
  8. python re 简单实例_python的re模块应用实例
  9. 【英语学习】【Level 07】U06 First Time L6 Not your typical experience
  10. Sophos 紧急修复已遭利用的防火墙 0day
  11. mysql key value_【mysql】大量的 key = value 值用什么方式存储?
  12. 【Android】 修复ijkPlayer进行m3u8 hls流播放时seek进度条拖动不准确的问题
  13. 2020 最新JavaWEB面试题
  14. html怎么修改像素,PS怎么修改像素又不改变尺寸?
  15. 一文快速了解EL表达式基础知识
  16. 显示12306服务器处理中正在排队,12306称能够解决技术问题 不与企业合作
  17. 五大领域总目标指南_五大领域总目标和各年龄段目标 -
  18. php后台开发—微信分销那点事
  19. 2022年最新全国各省五级行政区划代码及名称数据(省-市-区县-乡镇-村)
  20. Firework导航栏字体变大方法

热门文章

  1. 图书馆预约占座系统 (SSM JAVA)
  2. wi ndows防火墙,WinXP自带防火墙设置详细讲解
  3. iconfont阿里矢量图标库的引入与使用
  4. win7mysql卸载数据库_win7系统彻底卸载Mysql数据库的操作方法
  5. URLDecoder/URLEncoder使用场景
  6. 高德地图设置中国经纬度范围
  7. OCR条形码控件字体支持多种格式的OCR字体
  8. Java后端开发需要学什么
  9. 使用MLM和TLM训练XLM
  10. emtp和matlab的区别,用MATLAB和EMTP对输电线路进行故障定位数字仿真的比较