小飞的电梯调度算法

操作系统—电梯调度模拟程序(C语言,数据结构,含代码) 只要能不挂科。。。 阅读详情

一、问题

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

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

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

二、分析

照例,我们先把问题进行数学化,假设我们的楼层总共有N层,电梯停在第x层,要去第i层的乘客数目总数为 Tot[i],这样,所爬楼梯的总数就是
因此,我们要找的就是一个整数x,使得上面的那个式子最小。

三、解法一

当然,我们脑子里最简答的想法还是一个暴力解法,怎么算,一层一层试着来呗,如果电梯停在第一层,所有的乘客一共需要爬多少层,如果电梯停在第二层,所有的乘客一共需要爬多少层。。。。。等等,把所有的层数都试过来之后,找出那个需要的爬的总数最小的那个层数。
代码就不贴了,很简单。

四、解法二

接下来是重头戏了,我们来思考下,还有没有更好的方法呢,更低的时间复杂度呢?
我们这样思考,假设我们把电梯停在第i层,显然我们可以计算出所有的乘客总共需要爬的层数Y,那么假如我们再把电梯停在第i-1层呢?i层以下的乘客是不是就可以少爬一层了,i层以上的呢?是不是就需要多爬一层了呢?第i层的呢?是不是就也同样需要多爬一层了?
根据以上的思考,我们来算一下,如果有N1个乘客的目的楼层在第i层以下,有N2个乘客在第i层,有N3个乘客的目的楼层在第i层以上。假如我们把原来的电梯停在第i层换成停在第i-1层,那么第i层的乘客和第i层以上的乘客需要多爬了一层,总共需要多爬N2+N3层,i层以下的呢?就可以少爬一层,总共需要少爬N1层,那么一共需要爬
Y-N1+N2+N3。同理,如果我们把电梯停在i+1层,一共需要爬Y+N1+N2-N3层,那么也就是说如果:
N1>N2+N3,就是代表我们把电梯停在i-1比较好,同理如果N3>N1+N2,就代表我们把电梯停在i+1比较好。
根据这个规律一层一层考察,计算各位乘客需要爬楼梯的数目。然后在根据上面的策略进行调整,直到找到最佳楼层。这时总的时间复杂度为O(N)
接下来是我自己的思考:
其实书上的代码,我看了之后又一个疑问,代码中给出的意思就是说,当我们从第一层开始调整的时候,一旦发现再往上加一层的话就会使得乘客总的爬楼梯的层数变高,就代表当前层是最好的,但是我心里的疑问是,为什么?为什么不再往上调两层看看是不是最好的。
这个道理其实很简单,但是我还是自己证明了一下,还是刚才上面的例子,加入我们往上调了一层之后,发现乘客需要爬电梯的总数增多了,代表什么?就是说N3<N1+N2,那么假设我们的第i+1层的乘客数目为a个,第i+2层为b个,如果我们把停的电梯放在第i+2层,N3会怎么着?当然变小了,N3指的是停着的那一层上面的乘客数目,那么N1+N2呢,肯定变大,为什么,总数不变N3变小了,指定N1+N2就变大了呗,那么N3<N1+N2,同理你再往上调都是不行的。
代码我还是在网上找一个吧,很简单。
int N;  
int nPerson(N+1);  
int target_floor = 1;  
int min_floors = 0;  
int N1 = 0,N2 = nPerson[1],N3 = 0;  
for(i = 2;i<=N;i++)  
{  
    min_floors += nPerson[i] * (i-1);  
    N3 +=nPerson[i];  
}  
  
for(i = 2;i<=N;i++)  
{  
    if(N1+N2 < N3)  
    {  
        target_floor = i;  
        min_floors +=(N1+N2-N3);  
  
        N1 +=N2;  
        N2 = nPerson[i];  
        N3 -=nPerson[i];  
    }  
    else  
        break;  
}  
return target_floor;  
五、扩展问题
1. 往上爬楼梯,总是比往下走要累的。假设往上爬一个楼层,要耗费k单位的能量,往下走只需要耗费1单位的能量,那么如果题目条件改为让所有人消耗的能量最少,这个问题怎么解决。
这个问题很简单,就是在计算所需能量的时候上楼梯的时候乘以k,下楼梯乘以1就行,方法还是和解法二一个道理。
2. 在一个高楼里面,电梯只在某一个楼层停,这个政策还是不太人性化。如果电梯会在k个楼层停呢?
此问题,作为遗留问题吧,现在时间有点紧迫。

编程之美——小飞的电梯调度算法 编程之美——小飞的电梯调度算法         在高峰时间,实习生小飞常常会被电梯每层楼都停弄得很不耐烦,于是他想出了这样一个办法:由于楼层并不高,那么在繁忙的时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层。所有乘客都从一楼上电梯,到达某层楼后,电梯听下来,所有乘客再从这里爬楼梯到自己的目的层。在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。   问:电梯停在哪一 阅读详情

相关推荐

电梯调度算法(基于C语言)

模拟现实中的升降机载人过程,如有多层楼有请求搭电梯,电梯如何自主地选择最好的算法,更加方便人们的搭乘,同时使等待的时间最短

操作系统实验:驱动调度 模拟电梯调度算法 C语言实现

操作系统实验:驱动调度 模拟电梯调度算法 C语言实现

SCY164759920的博客 4278

电梯调度算法(算法合集)

我搜集的电梯调度算法,论文。包括:强化学习算法,LOOK调度算法,最短寻道算法,遗传算法,滚动优化算法,模糊控制,预约电梯群控算法,基于现场总线的算法。希望免除大家搜索之苦。

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

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

carson0408的博客 2310

驱动调度 模拟电梯调度算法C语言源码

#include #include #include #include typedef struct _proc { char name[32]; /*定义进程名称*/ int team; /*定义柱面号*/ int ci; /*定义磁道面号*/ int rec; /*定义记录号*/

C语言电梯调度算法

C语言电梯调度算法,数据结构课程设计

电梯调度问题求解

编程之美题目记录: 小飞的电梯调度算法 问题描述: 一栋楼共有N层,电梯从一层往上走,只允许停在其中某一层,所有乘客都从一楼上电梯,到达某层楼后,所有乘客从这一层爬楼梯道自己的目的层。在一楼时,每个乘客选择自己的目的层,电梯自动计算出应停的楼层。 问:电梯停在哪一层楼,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少。 # 解法1:暴力求解, 从第一层开始遍历,得到爬楼梯最少的楼层(时间复杂度O...

qq_26972735的博客 2329

电梯调度算法实现

操作系统电梯调度是比较经典的算法之一,采用C语言写出来,磨砺基本编程语言的基本功。

编程之美:小飞的电梯调度算法

一.问题描述    亚洲微软研究院所在的希格玛大厦一共有6部电梯。在高峰时间,每层都有人上下,电梯每层都停。实习生小飞常常会被每层都停的电梯弄的很不耐烦,于是他提出了这样一个办法: 由于楼层并不算太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层。所有乘客从一楼上电梯,到达某层后,电梯停下来,所有乘客再从这里爬楼梯到自己的目的层。在一楼的时候,每个乘客选择自己的...

weixin_34409703的博客 187

交换机救命命令手册:华为 & 思科平台最全运维指令速查表

很多时候,真正拉你一把的不是“高深理论”,而是你手里有没有一份靠得住的命令速查表。这篇文章,希望能成为你“进可调试,退可排障”的一份救命卡片。

HuaweiLab_Peach的博客 1515

域用户无法修改密码问题的解决方案

问题描述:加域的电脑无法更改密码,提示“无法更新密码,为新密码提供的值不符合字符域的长度、复杂度或历史要求”。 问题原因:域控制器中相关设置问题,主要如下图所示(如启用复杂性、最短期限和强制密码历史) 解决方案:在域控制器中更改对应的密码策略即可: ① 禁用复杂性要求 ② 最短使用期限改为0天 ③ 强制密码历史改为0 如果出现无法更改的情况,如下图箭头所指的图标所示 代表需要在域控制器的组策...

运维日记 3万+

1.8小飞的电梯调度算法

如果停靠在I-1层楼梯,电梯调度为y-(N1-N2-N3)如果停靠在i+1层楼梯,电梯调度为y-(n3-n1-n2)在停靠在第i层楼梯下,电梯调度是y。有n1个乘客在第i层楼梯之下。有n3个乘客在第i层楼梯之上。有n2个乘客在第i层楼梯。

2401_89287074的博客 191

2024高校网络安全管理运维赛题目--复现+题目+wp

官方writeup集思广益比较好的备份。

书山有路勤为径,学海无涯苦作舟 1320

《编程之美》小飞的电梯调度算法

亚洲微软研究院所在的希格玛大厦一共有6部电梯。在高峰时间,每层都有人上下,电梯每层都停。实习生小飞常常会被每层都停的电梯弄的很不耐烦,于是他提出了这样一个办法: 由于楼层并不算太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层。所有乘客从一楼上电梯,到达某层后,电梯停下来,所有乘客再从这里爬楼梯到自己的目的层。在一楼的时候,每个乘客选择自己的目的层,电梯则计算出

lonelycatcher小站 1万+

Windsurf 入门指南:从安装到实战(免费AI IDE新选择)

本文是Windsurf AI IDE的详细入门指南,涵盖从下载安装到核心功能实战的全过程。通过对比分析,文章指出Windsurf凭借其免费、小白友好的特性及强大的上下文感知能力,成为学习编程和提升开发效率的新选择,特别适合零基础开发者和寻求高效AI编程工具的开发者。

weixin_29237635的博客 854

TSMaster实战:如何用LIN总线唤醒你的汽车电子系统(附波形分析)

本文通过TSMaster工具实战解析LIN总线唤醒机制。详细介绍了LIN网络唤醒的协议要求、时序参数计算,并演示了如何在TSMaster中配置唤醒信号、捕获分析波形,以及验证休眠流程。文章结合常见问题排查,为汽车电子工程师提供了从理论到实践的完整调试指南。

weixin_28308325的博客 459

编程之美——小飞的电梯调度算法之新解

亚洲微软研究院所在的希格玛大厦一共有6部电梯。在高峰时间,每层都有人上下,电梯每层都停。实习生小飞常常会被每层都停的电梯弄的很不耐烦,于是他提出了这样一个办法: 由于楼层并不算太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层。所有乘客从一楼上电梯,到达某层后,电梯停下来,所有乘客再从这里爬楼梯到自己的目的层。在一楼的时候,每个乘客选择自己的目的层,电梯则计算出

To be a crazy and happy coder! 5700

VFIO框架源码分析(一)- 从初始化到设备访问

本文深入剖析了Linux内核中的VFIO(Virtual Function I/O)框架,详细解读了其从初始化到设备访问的全过程。VFIO通过Container->Group->Device的层次化设计,利用IOMMU提供安全隔离,允许用户空间直接访问物理设备。文章基于Linux v5.15版本,重点分析了vfio_init模块入口、Container创建与配置、Group关联以及最终设备访问等关键环节,揭示了VFIO如何通过逐层授权机制构建安全可靠的设备直通模型,为虚拟化技术提供核心支持。

qq_36071928的博客 380

小飞的电梯调度算法@编程之美

题目:(编程之美 1.8)一栋楼有6层,现在设计一种电梯调度算法:电梯在一楼让大家上电梯,然后根据大家选择要到的楼层算出某一楼层i,电梯在i层停下让所有人下电梯,然后大家爬楼梯达到自己的楼层。请问电梯停在哪一层,可以使得这一次的所有乘客爬楼层之和最短? 思路: 1.电梯调度

飞鸟 1174

vscode配置matlab工作环境

前面有两篇文章我们分别讲了在vscode里面如何配置C语言环境和python环境,那两篇文章总体来说比较复杂,当然这篇也有许多有趣的问题。 附上链接: 文章目录matlab简介基本要求code runner插件与matlab相关的插件添加路径小结code runner是否支持更多语言更多选择另一个选择 matlab简介 MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。 MATLAB是ma

Cachel Wood的博客 4540

获取微信公众号历史文章列表页链接

action=home&__biz=这里替换你的biz==4、链接分享、发送到微信即可访问,注意该链接仅可在微信客户端使用,外部浏览器无法打开。3、拼接通用公式生成链接即为微信公众号历史文章列表链接。,如下图找到红框部分值,复制即为上文biz值。2、浏览器右键查看网页源码,新开页面搜索(1、复制公众号任意文章的链接在浏览器打开。

珞瑜的博客 7943

【数学】小飞的电梯调度算法

题目:《编程之美》P53 若干个乘客从一楼上电梯,电梯出发后,只能停靠在某一层。问电梯停在哪一层,可以让所有乘客走的总楼层数最少? 分析: 电梯可以停在负层,但没有0层。所以程序返回0时,表示出错。这里有个陷阱,因为没有0层,所以在计算时,应该先把负数的楼层加1.当最后算出来的结果小于等于0时,再减去一,才是实际中的负数层数。         int best_stop_floor

bupt8846的专栏 1028

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: 光影切割问题
下一篇: 2016年1月10日
云金
博客等级 码龄11年 11粉丝 20原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值