编程之美-电梯问题-java版

 原文来自:http://www.dev26.com  <!--EndFra-->

在办公楼的电梯里高层期间,每层都有人上下。电梯呢只要每层有一个人都有停一次。这样比较麻烦,对于比较低的楼层(6层),每次电梯从一层往上走时,我们只允许电梯停在其中的某一层,然后所有的乘客爬楼梯到自己的目的层。在一楼时,每一位乘客选择自己的楼层,电梯根据每层的人数来计算出应该停的楼层.

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

分析与解法:

   该问题本质是一个优化问题。首先为这个问题找一个合适的抽象模型。从问题中可以看出,有两个因素会影响到最后的结果:乘客的数目及需要停的目的楼层。因此我们可以统计到达各层的乘客数目开始分析。

假设楼层总共有N层,电梯停在第X层,要去第i层的乘客数目总数为Tot[i],这样,所以爬楼梯的总数就是∑Ni=1  {Tot[i]*|i-x|}的值最少.

解法一:

   首选考虑简单解法.

   可以从第1层开始枚举x一直到N层,然后在计算出如果电梯在x层停的话,所以乘客总共有爬多少层。这是最直接的一种方法。

这个需要一个双重循环来完成计算:时间复杂度为O(N2)

解法二:

  进一步分析,假设电梯停在第i层,显然我们可以计算出所有乘客总共要爬的楼梯层数Y。如果有N1个乘客目的楼层在第i层楼以下,有N2个乘客在第i层楼,还有N3个乘客在第i层楼以上。这个时候,如果改停在i-1层楼,所有目的地在第i层及以上的乘客都需要多爬1层,总共需要多爬N2+N3层,而所有目的地在i-1层及以下的乘客可以少爬1层,总共可以少爬N1层。因此,乘客总共需要爬的层数为Y-N1+(N2+N3)=Y-(N1-N2-N3)层。

反这,如果电梯在i+1层,那么乘客总共需要爬的层数为Y+(N1+N2-N3)层。由此可见,当N1>N2+N3时,电梯在第i-1层停更好,乘客走的楼层数减少(N1-N2-N3);

而当N1+N2>N3时,电梯停在i+1层停更好;其他情况下,电梯停在第i层最好。

根据这个规律,我们从第一层开始考察,计算各乘客需要爬楼梯的数目。然后根据上面的策略进行调整,直到找到最佳楼层。总的时间复杂度降为O(N)

 

package com.floor;
     
/***
 * 电梯优 化方法
 *
 * */
public class Floor {
    public static void main(String[] args) {
        getMinFloors(4, 1);
        betterFloors();
    }
     
    // 双层循环法,计算所以乘客要爬多少层楼梯。。时间复杂度为o(N^2)
    public static void getMinFloors(int nTargetFloor, int nMinFloor) {
        // 以下是要去往电梯各层的人数
        int[] persons = { 0, 2, 0, 1, 3, 5, 8, 4, 6, 0 };
        int N = 9;// 电梯一共有多少层
        for (int i = 1; i <= N; i++) {
            int nFloor = 0;
            for (int j = 1; j < i; j++) {
                nFloor += persons[j] * (i - j);// 计算往下爬的楼层数
            }
            for (int j = i + 1; j <= N; j++) {
                nFloor += persons[j] * (j - i);// 计算往上爬的楼层数
            }
            if (nTargetFloor == -1 || nMinFloor > nFloor) {
                nMinFloor = nFloor;
                nTargetFloor = i;
            }
            System.out.println("如果停在第" + i + "层需要爬" + nFloor + ":趟电梯");
        }
    }
     
    // 更优方法
    public static void betterFloors() {
        // 以下是要去往电梯各层的人数
        int[] persons = { 0, 2, 0, 1, 3, 5, 8, 4, 6, 0 };
        int N = 9;// 电梯一共有多少层
        int nTargetFloor = 1;
        int nMinFloor = 0;
        int N1 = 0, N2 = persons[1], N3 = 0;
        for (int i = 2; i <= N; i++) {
            N3 += persons[i];
            nMinFloor += persons[i] * (i - 1);//先计算出所以应该要爬的楼层总和
        }
        for (int i = 2; i <= N; i++) {
            if (N1 + N2 < N3) {
                nTargetFloor = i;
                nMinFloor += (N1 + N2 - N3);
                N1 += N2;
                N2 = persons[i];
                N3 -= persons[i];
            } else {
                break;
            }
        }
        System.out.println("优化方法结果:停在第" + nTargetFloor + "层要爬:" + nMinFloor
                + "次");
    }
     
}

<!--EndFragment-->

Java电梯调度系统课程设计 电梯作为垂直交通工具,它的核心功能是实现楼层间的高效运输。它由一系列相互协作的机械组件和电气控制系统组成,包括:轿厢、门系统、对重、导向系统、曳引系统、控制系统等。每个部分都设计得精细且复杂,确保电梯运行平稳安全。电梯调度算法是电梯系统中最为核心的组成部分之一,它决定了电梯如何响应外部请求并执行有效调度。常见的电梯调度算法有以下几种:先来先服务(FCFS):这是一种最简单的调度算法,按照请求到达的顺序对电梯进行调度。该算法的缺点是容易造成“电梯饥饿”现象,即某些请求等待时间过长。 阅读详情

相关推荐

Java电梯捎带系统模拟与实现

Java语言因其平台无关性和面向对象的特性,成为了开发电梯模拟系统的理想选择。系统的设计需要充分考虑电梯运行的逻辑和现实世界的行为,Java语言提供了强大的面向对象编程支持,这使得模拟现实世界中的电梯系统变得更为直观和高效。乘客类代表电梯系统中的用户。乘客类应当包含乘客的基本信息,例如起始楼层和目的楼层。此外,乘客类还应包含乘客在电梯系统中的行为,比如请求电梯和在电梯内选择目的楼层。以下是乘客类的一个简单示例:// 乘客在电梯内选择目的楼层。

weixin_30591519的博客 1048

java——傻瓜电梯

学习目标: 按照文档实现傻瓜电梯,具体要求入下: 1、每组2-4人 2、完成公测用例。如果未完成公测用例需要说明完成公测用例第几到第几个,未完成那几个。 3、注意增加合理代码注释。 4、注意变量,函数和类名的命名规范。命名原则:能一眼识别出来,例如 年龄 iAge 体现变量类型和逻辑意义。 5、注意电梯临界时间,如果计算时间和公测用例和文档不一致,如果能给出合理解释需提供相关文档说明。 6、注意合理的封装,例如某些公共功能如何封装更合理。 要求: 一:要求; OO 第二次作业要求

qq_44718118的博客 2519

Fast-LIO2轮速计融合实战:打滑检测与协方差调参避坑指南

多传感器融合是提升移动机器人定位鲁棒性的关键手段。在激光雷达与惯性测量单元(IMU)紧耦合的基础上,加入轮式编码器作为额外的速度约束,能够有效抑制长走廊、重复纹理等退化场景下的漂移。其核心原理是通过运动学模型将轮速转换为机体系速度,并作为因子引入迭代误差状态卡尔曼滤波器(ESIKF)。然而,打滑现象与协方差参数设置是融合成败的关键。本文从工程实践出发,系统梳理了传感器配置、外参标定、打滑检测策略(运动学一致性、轮速自洽性)以及观测噪声协方差R与初始协方差P0的调参方法,并给出实测参数与问题排查速查表,为在F

weixin_34159110的博客 433

电梯算法java_电梯调度算法总结

一:任务要求本次的程序任务和要求如上图所示,需要有4部电梯同时运行,每部电梯都有自己的限制且被同一控制器所控制,希望有图形显示效果,本次的任务我们组已经完成,关于编程的历程与总结现在就一一道来。二:初步构想阶段我们先尝试解决最核心的问题,即电梯的调度算法问题,初步构思是这样的,电梯根据当前控制器内所要到的楼层信息判断是向下运行或向上运行,并向上或向下运行至控制器内楼层的最大或最小值,期间出现的所...

weixin_39687359的博客 2231

L2-011 玩转二叉树

L2-011玩转二叉树(25分) 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。 输出格式: ...

Beworth1207的博客 1733

避坑指南:Allegro 17.2更新封装时遇到的5个典型问题及解决方案(含Symbol报错处理)

本文深度解析Allegro 17.2封装更新过程中的核心机制与常见陷阱。针对“Update Symbols”功能失效、焊盘不匹配、DRC报错、图形层叠错误等5大典型问题,提供从原理分析到实战解决方案的完整指南,帮助用户实现从“更新失败”到“丝滑替换”的平稳过渡。

tgb34567890的博客 1039

java 电梯算法_编程之美之小飞的电梯调度算法(多种解法)---Java语言

1.题目情景我们假设都是从一楼上电梯的,而至于讯电梯停在其中的某一层。即所有的乘客都从一楼上电梯,到达某层之后,电梯停下来,所有乘客再从这里爬楼梯到自己的目的层。在一楼的时候,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层,并且能够保证该层停使得所有乘客爬楼梯的层数之和最少。输入:第一行楼层数N,乘客人数n;第二行有n个数,表示乘客选择的目的层。输出:输出为停止楼层和总共需要爬的楼梯。2.解...

weixin_33190667的博客 901

MQL5教程 01 MT5有关EA的操作、MetaEditor 工具栏主要功能

MQL5教程 01 MT5有关EA的操作、MetaEditor 工具栏主要功能

weixin_42830015的博客 3983

java面向对象思维程序设计开发以及案例 -电梯运行问题对象分析与程序设计(2)

电梯是我们日常生活中经常看见和使用的运载工具,但其中也隐藏着一个精而小的程序,我们今天模拟一个电梯运行程序来开始我们面向对象之旅 DDD领域驱动开发入门,充血模型,面向对象程序设计核心思想原则...

峡谷电光马仔的博客 1943

保姆级教程:用Seurat 5.0.1搞定单细胞测序数据从质控到细胞注释的全流程

本文提供了一份详细的Seurat 5.0.1单细胞测序数据分析教程,涵盖从数据质控到细胞注释的全流程。通过R代码示例和可视化分析,帮助用户掌握单细胞RNA测序数据处理的核心技术,包括数据标准化、降维聚类和细胞类型注释,适用于生物信息学研究和临床数据分析。

weixin_29067143的博客 196

避坑指南:在Ubuntu 22.04上配置UR5e与ROS2 Humble真机通信的完整流程

本文详细介绍了在Ubuntu 22.04上配置UR5e机械臂与ROS2 Humble真机通信的完整流程,包括环境准备、网络配置、URCap安装、ROS2驱动部署及控制器状态验证等关键步骤。特别针对常见问题如网络连接失败、驱动启动错误等提供了实用解决方案,帮助工程师高效完成UR5e与ROS2的集成工作。

weixin_30790841的博客 463

OJ-Elevator(电梯问题java)

OJ-Elevator(电梯问题JAVA) 分三种情况分析,上楼,下楼和不动 上楼:楼层差×上一层楼的时间+停留的时间 下楼:楼层差×下一层楼的时间+停留的时间 不动:只需加上停留一层的时间即可 import java.util.Scanner; public class first_L { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int upti

m0_51276753的博客 572

ROS专栏—基于STM32F103的INA219电源数据采集

文章主要记录了stm32f103对ina219的数据采集

热爱生活、奋斗前行 2353

编程之美---电梯调度算法

编程之美---电梯调度算法

Jarvan_Song的博客 1万+

OpenClaw实战四|内容创作全流程AI助理:自动撰稿+智能剪辑+多平台发布,一人顶一个内容团队

AI替代的是「写稿、剪辑、发布」这种流水线工作,真正让你解放出来,去做选题、创意、人设、变现这些高价值的事。OpenClaw这套内容创作全流程AI助理,最大的价值不是「帮你发内容」,而是让一个人,拥有一个内容团队的产能。不管是个人博主、小团队,还是企业新媒体,都能用零代码的方式,快速搭建属于自己的自动化内容矩阵。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 588

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

电梯调度程序 java_电梯调度编写(oo-java编程)

第二单元的问题是写一个关于电梯调度的程序。需要模拟一个多线程实时电梯系统,从标准输入中输入请求信息,程序进行接收和处理,模拟电梯运行,将必要的运行信息通过输出接口进行输出。主要锻炼学生的多线程程序编写能力。由于需要实时的输入和输出,我们不得不采用多线程。在这个单元中任务仍然被分为三个小任务:①完成单电梯(随时允许输入)②单电梯+(楼层增加负层,必须使用比先来先服务更加高效的算法)③多电梯调度(增加...

weixin_28961565的博客 1612

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java面向对象电梯运行代码_面向对象编程总结——多线程电梯

最近的三周面向对象的作业是电梯问题。主要是对多线程编程的一种训练。主要还是对生产者——消费者模型的使用的理解。作业分成了三个阶段,第一个阶段是FIFO调度策略的电梯。第二个阶段是可捎带的电梯设计,第三个部分是多个停靠楼层不同运行速度不同的电梯的合作。FIFO因为第一次的作业没有性能上的要求只需要满足正确性,所以我设计了两个线程协同完成这个任务。是个标准的生产者消费者问题。输入线程向共用缓冲区中写入...

weixin_35971708的博客 971

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java模拟电梯程序_Java编写的电梯模拟系统《结对作业》

伙伴成员:李伊 http://home.cnblogs.com/u/Yililove/对于这次作业,我刚开始一点思绪都没有,在老师安排了结对伙伴李伊之后,我的搭档问我,我们需要什么编程语言来编写程序,我细想了一下,大一到大三,我们就学了C语言、C++就这两种语言,而且C一开始果断放弃,因为没法做界面,C++也觉得不靠谱,虽然可以做界面,但是太麻烦,也指望不上。进入大三以后,自己选修过JAVA,自学...

weixin_31601663的博客 943

电梯调度算法总结

一:任务要求    本次的程序任务和要求如上图所示,需要有4部电梯同时运行,每部电梯都有自己的限制且被同一控制器所控制,希望有图形显示效果,本次的任务我们组已经完成,关于编程的历程与总结现在就一一道来。 二:初步构想阶段 我们先尝试解决最核心的问题,即电梯的调度算法问题,初步构思是这样的,电梯根据当前控制器内所要到的楼层信息判断是向下运行或向上运行,并向上或向下运行至控...

gb4215287的博客 2480

基于JAVA的电梯调度模拟

一、项目要求概述1.1 项目目的通过控制电梯调度,实现操作系统调度过程学习特定环境下多线程编程的方法学习调度算法1.2 开发环境语言:java系统平台:全平台(具备java环境)IDE:Intellij IDEA产品呈现模式:jar包执行环境要求:安装javaWin:安装java配置环境变量后双击Linux/Mac:命令行:java –jar 电梯.jar...

u011266786的博客 3129

单例电梯调度问题

总的来说:三次题目难度逐渐递增,在整个迭代的过程中,我对于单例电梯LOOK算法的理解逐渐加深,在设计电梯的移动逻辑上逐渐地完善。踩坑:主要是前期准备不足,花在设计方法的分工和逻辑的时间较少,导致后期花费了大量地时间修改代码的逻辑,填补代码漏洞。然后由于代码长度过长,无法提交,还花费时间重新将部分代码带包成方法,最后加注释。####学习收获学习单一职责原则SRP。

2402_86409635的博客 981

Java编程题 | 张三等待乘坐电梯的时间计算

题目描述 张三在学校教学楼的电梯前排了很多人,他的前面有n个人在等电梯。电梯每次可以乘坐12人,每次上下需要的时间为4分钟(上需要2分钟,下需要2分钟)。 请帮助张三计算还需要多少分钟才能乘电梯到达楼上。(假设最初电梯在1层)

yingzix688的博客 938

结对编程————电梯调度

作业内容:电梯调度 现有一新建办公大厦,共有21层,共有四部电梯,所有电梯基本参数如下表所示: 电梯编号 可服务楼层 最大乘客数量 最大载重量 1 全部楼层 10 800 kg 2 单层 10 800 kg 3 ...

weixin_33819479的博客 368

编程之美-电梯调度算法

1、简单的双重循环可以解决O(N ) 2、书中提出另一种想法 假设电梯停在i层 爬楼梯的总数为Y 若电梯停在i-1层 则i层以上的N3人 需要多爬一层 i层的N2也需多爬一层 i-1层的N1人则少爬一层  所以总共走的数目为 Y-N1+N2+N3 即 Y-(N1-N2-N3) 若在i+1层停下  则i+1层的N3人少一层  i层和i-1层多走N2+N1  总的数目为Y-N3+N1+N2 即

Fivesplus的专栏 1197

【2014-01-08】《编程之美》读书笔记:电梯调度算法

《编程之美》1.8 节"小飞的电梯调度算法"的 Java 实现,给出两种解法:暴力枚举每层总人力消耗(O(n²)),以及利用 F(i+1)=F(i)+N1+N2-N3 递推公式的线性优化方案,并附测试数据生成代码。

cstriker1407的专栏 20
上一篇: spring Security3.1安全框架完整配置教程
下一篇: java站内消息的解决方案
wtsoftware
博客等级 码龄19年 12粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值