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

1.题目情景

我们假设都是从一楼上电梯的,而至于讯电梯停在其中的某一层。即所有的乘客都从一楼上电梯,到达某层之后,电梯停下来,所有乘客再从这里爬楼梯到自己的目的层。在一楼的时候,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层,并且能够保证该层停使得所有乘客爬楼梯的层数之和最少。

输入:第一行楼层数N,乘客人数n;第二行有n个数,表示乘客选择的目的层。

输出:输出为停止楼层和总共需要爬的楼梯。

2.解法一

第一种方法就是采取暴力求解的办法,采用双重循环的方式,外循环控制停的楼层,内循环计算当前楼层停,总共需要爬多少楼层,并保留最小值及其相应停电梯的楼层。

具体代码如下:

package bianchengzhimei.part1_8;

import java.util.*;

public class ElevatorController {

public static void main(String[] args) {

// TODO Auto-generated method stub

Scanner sc=new Scanner(System.in);

int N=sc.nextInt();

int n=sc.nextInt();

int passenger[]=new int[n];

for(int i=0;i

{

passenger[i]=sc.nextInt();

}

int stopFloor=0;

int minFloor=Integer.MAX_VALUE;

for(int i=1;i<=N;i++)//控制停电梯的楼层

{

int temp=0;

for(int j=0;j

{

temp+=Math.abs(passenger[j]-i);

}

if(temp

{

minFloor=temp;

stopFloor=i;

}

}

System.out.println("最佳停电梯的楼层为:"+stopFloor);

System.out.println("乘客需要爬楼梯的总数为:"+minFloor);

sc.close();

}

}

运行结果如下:

10 6

4 8 3 9 10 5

最佳停电梯的楼层为:5

乘客需要爬楼梯的总数为:15

这种方法比较简单直接,因此复杂度较高,为O(N*n),所以接下来我们想办法降低复杂度。如果n大于N,那么可以将上述程序做一些修改也可以稍微降低复杂度。当n大于N时,先计算N层楼每层楼有几个乘客,复杂度为O(n),然后再遍历,遍历过程复杂度为O(N*N),因此下面程序总复杂度为O(n+N*N)。

package bianchengzhimei.part1_8;

import java.util.*;

public class ElevatorController {

public static void main(String[] args) {

// TODO Auto-generated method stub

Scanner sc=new Scanner(System.in);

int N=sc.nextInt();

int n=sc.nextInt();

int passenger[]=new int[N+1];

for(int i=0;i

{

passenger[sc.nextInt()]+=1;

}

int stopFloor=0;

int maxFloor=Integer.MAX_VALUE;

for(int i=1;i<=N;i++)//控制停电梯的楼层

{

int temp=0;

for(int j=1;j<=N;j++)//计算停在当前楼层,总共需要爬的楼层

{

temp+=Math.abs(j-i)*passenger[j];

}

if(temp

{

maxFloor=temp;

stopFloor=i;

}

}

System.out.println("最佳停电梯的楼层为:"+stopFloor);

System.out.println("乘客需要爬楼梯的总数为:"+maxFloor);

sc.close();

}

}

3.解法二

我们假设停在第i层楼,那么当前楼层需要爬的总楼层是Y。如果有N1个乘客在楼层i以下,有N2个乘客在第i层楼,还有N3个乘客在第i层以上。那么如果现在电梯停在i-1层,则总共需要爬Y-N1+(N2+N3)层,如果改在i+1层,那么总共需要爬Y-N3+(N2+N1)层,所以我们可以换个思路,当电梯从一楼逐渐往上走的时候,当N2+N1-N3<0时,则继续往上爬,当当N2+N1-N3>=0,则可以停下来,因为往上爬的过程中N3是逐渐减小的,一旦N2+N1-N3>=0之后,那么随着楼层往上爬,这个差值会越来越大,即代表人们要爬的总楼层越来越多,所以当差值不再为负即可停下来。

实现代码如下:

package bianchengzhimei.part1_8;

import java.util.Scanner;

public class ElevatorController2 {

public static void main(String[] args) {

// TODO Auto-generated method stub

Scanner sc=new Scanner(System.in);

int N=sc.nextInt();

int n=sc.nextInt();

int Floor[]=new int[N+1];//用来统计每个楼层停下的人数

for(int i=0;i

Floor[sc.nextInt()]+=1;

sc.close();

int stopFloor=1;//先从第一层开始推算

int N1=0;//停在第一层的话,第一层是最低的,那么N1则为0

int N2=Floor[1];//假设第一次停在第一层,求出目标楼层是当前楼层的人数.

//计算N3的初始值和停在1层对应的nMinFloor值

int N3=0;

int nMinFloor=0;

for(int i=2;i<=N;i++)

{

N3+=Floor[i];

nMinFloor+=Floor[i]*(i-1);

}

//然后逐渐往上走,寻找最优目标楼层。

for(int i=2;i<=N;i++)

{

if(N1+N2-N3<0)//即判断往上走,爬楼梯总数是否会减少。

{

N1+=N2;

N2=Floor[i];

N3-=Floor[i];

stopFloor=i;//更新停电梯楼层.

nMinFloor+=(N1+N2-N3);//更新爬楼梯总数

}

else

break;

}

System.out.println("最佳停电梯的楼层为:"+stopFloor);

System.out.println("乘客需要爬楼梯的总数为:"+nMinFloor);

}

}

以上解法是从第一层往上走,依次更新相应的数据,直到目标值不能再优化时,得到最优值。运行结果如下:

10 6

4 8 3 9 10 5

最佳停电梯的楼层为:5

乘客需要爬楼梯的总数为:15

4.解法三

其实,还有一种解法,有n个乘客都有自己需要去的楼层,在停止楼层下电梯之后,大家都要去自己的目标楼层,那么我们假设每位乘客都已经在目的楼层了,那么我们可以将问题转换为,所有乘客在哪一层碰头,所需要爬的楼梯最少。一般这种会面算法,最佳地点应该选择在中间数,即将每一位乘客所在位置,放进一个数组并排序取中间数就是最佳会面地点。(注:当乘客数为n,则最佳地点就是有序地点集合中第(n+1)/2个元素代表的地点)。其中这里的排序可以用桶排序,因为楼层数不会过于庞大,那么把每一层都当做一个桶,然后把相应的人放进去,桶号即数组下标,然后逐个取出就完成了排序,复杂度是线性的。

package bianchengzhimei.part1_8;

import java.util.Scanner;

public class ElevatorController3 {

private static int[] calSort(int[] a,int N,int n)

{

int[] res=new int[n];

int k=0;

for(int i=0;i<=N;i++)

{

int temp=a[i];

while(temp>0)

{

res[k++]=a[i];

}

}

return res;

}

public static void main(String[] args) {

// TODO Auto-generated method stub

Scanner sc=new Scanner(System.in);

int N=sc.nextInt();

int n=sc.nextInt();

int passenger[]=new int[N+1];

for(int i=0;i

{

passenger[sc.nextInt()]+=1;

}

sc.close();

int[] res=calSort(passenger,N,n);//桶排序

int stopFloor=res[(n+1)/2-1];

int nMinFloor=0;

for(int i=1;i<=N;i++)

{

nMinFloor+=(i-stopFloor)*passenger[i];

}

System.out.println("最佳停电梯的楼层为:"+stopFloor);

System.out.println("乘客需要爬楼梯的总数为:"+nMinFloor);

}

}

运行结果:

10 8

1 1 2 7 8 8 8 9

最佳停电梯的楼层为:7

乘客需要爬楼梯的总数为:22

---------------------

作者:carson0408

来源:CSDN

原文:https://blog.csdn.net/carson0408/article/details/79184859

版权声明:本文为博主原创文章,转载请附上博文链接!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[html] 关于<form>标签的enctype属性你有哪些了解?

[html] 关于标签的enctype属性你有哪些了解&#xff1f; form 标签的 enctype 属性指定将数据回发到服务器时浏览器如果对表单数据进行编码&#xff0c;其有三种编码形式&#xff1a;application/x-www-form-urlencoded(也是默认格式)application/x-www-form-urlencoded编码类…

砂.随笔.二十.微笑

左脑和右脑在争吵 左手和右手在撕扯 左脚和右脚走向两端 撕扯着神经 我想要疯狂地尖叫 但熟悉的人和面孔在对着我微笑 那么弯起嘴角吧 那么眯起眼角吧 那么就这样吧 就只能是这样了 我的尖叫和痛哭掩盖在微笑的面具下慢慢窒息 这样或许是最好的 谁都不知道你们曾经到来过 那么就…

[html] 说说你对属性data-的理解

[html] 说说你对属性data-的理解 data- 属性是H5新增的自定义属性&#xff0c;也可以用来存储值。我个人用的不多&#xff0c;这个data- 属性倒是和vue中的v-bind 功能相似&#xff0c; 自定义属性&#xff0c;绑定数据。也和上面说的一样可以通过js进行获取使用个人简介 我是…

React中添加注释

React中的注释&#xff0c;其实确切来讲是jsx中的注释&#xff1a; {/*单行注释*/}{/*多行注释 */} 转载于:https://www.cnblogs.com/wsg25/p/10818246.html

好文章系列(都是网上非常好的文章)

CSDN第一期总结之一&#xff1a;Form问题 CSDN第一期总结之二&#xff1a;ADO.NET DataGrid的问题 CSDN第一期总结之三&#xff1a;Thread的问题 CSDN第一期总结之四&#xff1a;Stream的问题 转载于:https://www.cnblogs.com/woowater/archive/2008/12/03/1346975.html

[html] 请说说<script>、<script async>和<script defer>的区别

[html] 请说说<script> : 加载的时候是同步的会阻塞后面代码的执行&#xff0c;加载立即执行。<script async>: 异步加载&#xff0c;加载和执行是并行的。<script defer>: 异步加载&#xff0c;需等到所有文档加载完才执行。个人简介 我是歌谣&#xff0c;…

electron-关闭之前,弹出提示窗

tips:写的时候&#xff0c;如果不在弹窗之前调用一次阻止默认事件&#xff0c;窗口就会直接关闭&#xff1b; 对话框dialog 在主进程中调用&#xff0c;const {dialog} require(electron); 传送门&#xff1a;electron dialog对话框 转载于:https://www.cnblogs.com/huangmin1…

java 定义对象数组_javascript如何定义对象数组

问题如下&#xff0c;已经完成单个对象的简单应用&#xff0c;希望定义一个数组&#xff0c;能包含多个student。var student new Object();student.name "Lanny";student.age "25";student.location "China";var json JSON.stringify(stud…

英文学习网站

(转)笑看风云淡Official Silverlight WebSiteNikhil Kothari(微软Principal Architect)s blogBrad Adams(首席产品部门经理)s BlogJesse Liberty(微软高级程序经理)s BlogTim Heuer(微软高级程序经理)s Blog(很nice的一个人&#xff0c;我内部发信问过问题^_^)Adam Kinney(微软…

进程(二)

import osimport timefrom multiprocessing import Processdef func(args,args2): print(args,args2) time.sleep(3) print(子进程 :, os.getpid()) print(子进程的父进程 :, os.getppid()) print(12345)if __name__ __main__: p Process(targetfunc,args(…

[html] 你了解什么是无障碍web(WAI)吗?在开发过程中要怎么做呢

[html] 你了解什么是无障碍web&#xff08;WAI&#xff09;吗&#xff1f;在开发过程中要怎么做呢 navigation control (tabindex)focus control (js)semantic html (h1, form, section...aria roles, labels...alt...)color theme (color-blind friendly)keyboard action supp…

硬盘 光驱 跳线问题

1.硬盘出厂时一般默认就是“主盘”&#xff0c;而光驱出厂时的跳线一般默认是“从盘”。 2.数据线上的三个端口是有定义的&#xff0c;不能随便连接设备。中间的那个端口是“Slave”&#xff0c;是用来连接从盘的&#xff1b;离“Slave”端口最近的那个是“Master”&#xff0c…

区域负责人常用的ChatGPT通用提示词模板

区域市场分析&#xff1a;如何分析区域市场的特点、竞争态势和客户需求&#xff1f; 区域销售策略制定&#xff1a;如何制定针对区域市场的销售策略&#xff0c;包括产品定位、价格策略、渠道策略等&#xff1f; 区域销售目标设定&#xff1a;如何设定明确的区域销售目标&…

integer对应java类型_Java中的Integer和int等包装类和基本数据类型简单比较

在初学Java时我们接触到的都是一些基本的数据类型&#xff0c;比如int , float,double等。但是对于高等语言JAVA等面向对象的语言来说&#xff0c;一切都是对象。如此看来这些基本数据类型显得就有些‘单薄’--------它只有一个值。这点令我们在面向对象编程时多少有些不适。因…

[html] 网页上的验证码是为了解决什么问题?说说你了解的验证码种类有哪些

[html] 网页上的验证码是为了解决什么问题&#xff1f;说说你了解的验证码种类有哪些 解决的问题&#xff1a;防止机器行为&#xff0c;确定是人为操作&#xff0c;比如登陆、发帖等。保护服务器&#xff0c;比如12306买票的时候&#xff0c;各种抢购的时候。验证码的类型&…

nodejs接收post数据

var qsrequire(querystring);var obj"";req.on(data,function(data1){ //数据较大&#xff0c;分多次接收objdata1;})req.on("end",function(){ //接收完成后的操作objqs.parse(obj);res.writeHead(200, { content-type:text/html;charsetutf-8});res.wr…

uushare新增类似美味(del.icio.us)的书签服务

书签是用于收藏网址的一种工具&#xff08;又称为网络收藏夹&#xff09;&#xff0c;通过它你可以将常访问的网站或平时发现感兴趣的网址收藏起来。 跟浏览器中的收藏夹不同&#xff0c;书签的优点是可以随时随地收藏大量的网址并且便于管理和寻找&#xff0c;同时不用担心因系…

java owl文件_jena解析.owl文件 实现owl文件的解析 - 下载 - 搜珍网

压缩包 : dca8341a689eea992f7e364244ae0.zip 列表jenaApp/jenaApp/.classpathjenaApp/.projectjenaApp/.settings/jenaApp/.settings/.jsdtscopejenaApp/.settings/org.eclipse.jdt.core.prefsjenaApp/.settings/org.eclipse.wst.common.componentjenaApp/.settings/org.eclip…

[html] 说说你对HTML元素的显示优先级的理解

[html] 说说你对HTML元素的显示优先级的理解 这个我记得前面的已经提过了&#xff0c;无非就是frameset优先级最高 z-index可以提高同等级的元素的显示 再一个就是有窗口的比没窗口的高 表单元素比非表单元素优先级高个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知…

HttpClient系列~StringContent与FormUrlEncodedContent

知识点 本文是一个很另类的文章&#xff0c;在项目中用的比较少&#xff0c;但如果项目中真的出现了这种情况&#xff0c;我们也需要知道如何去解决&#xff0c;对于知识点StringContent和FormUrlEncodedContent我们应该了解的多一点&#xff0c;FormUrlEncodedContent是以键/值…