题目:

•石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停。信1201-1班的张一东觉得在每层都停觉得不耐烦。
•由于楼层不太高,在上下课高峰期时时,电梯从一层上行,但只允许停在某一楼层。在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。
•问电梯停在那一楼层,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少。
一、设计思想

1、解法一

  可以从第一层开始枚举一直到第N层,然后计算如果电梯在第x层停的话所有乘客总共要爬多少层楼。这是最为直接的一个解法。程序代码就是两重循环,找到最小值,这个算法的时间复杂度O(N^2)。

2、解法二(优化)

  假设电梯停在第 i 层楼,我们计算出所有乘客总共爬楼梯的层数是Y。如果有N1个乘客想去的楼层在第 i 层之下,有N2个乘客正好想去的楼层是第 i 层,有N3个乘客想去的楼层在第 i 层之上。这个时候,重点来了:如果电梯改停在i-1层,所有目的地在第i - 1层以下的乘客可以少爬1层,总共少爬N1层,所有在i层及以上的乘客要多爬一层,总共多爬N2+N3层,这时总共需要爬Y-N1+N2+N3。反之,如果电梯在i+1层停所有目的地在第 i 层以上的乘客可以少爬1层,总共少爬N3层,所有在 i 层及以下的乘客要多爬一层,总共多N1+N2层,这时总共需要爬Y+N1+N2-N3层。可见,当N1 > N2+N3 时,电梯在第i-1层楼停更好;当N1+N2 <  N3 时,电梯在i+1层停更好。其他情况在第i层更好。如此一来,问题的解法就出来了,从第一层开始考察,计算各位乘客走的楼层的数目,然后根据N1,N2,N3之间的关系进行调整,知道找到最佳楼层,这样算法时间复杂度优化到了O(N)。

二、源代码

 package com.java.lianxi;

 import java.util.Scanner;

 public class lianxi6 {
public static void main(String[] args){
int N,num;//电梯层数,乘客要停的电梯数
Scanner in=new Scanner(System.in);
System.out.print("请输入楼层数:");
N=in.nextInt();
int array[]=new int[N+1];
for(int i=2;i<=N;i++)
{
System.out.print("请输入去第"+i+"层的乘客数:");
array[i]=in.nextInt();
}
fangfa1(N,array);
fangfa2(N,array);
}
public static void fangfa1(int N,int array[])//枚举
{
int sum[]=new int[N+1];//停在某层的结果
for(int i=2;i<=N;i++)sum[i]=0;
for(int i=2;i<=N;i++)
{
for(int j=2;j<=N;j++)
{
int k=i>j?(i-j):(j-i);
sum[i]+=array[j]*k;
}
}
int min=sum[2],m=2;
for(int i=3;i<=N;i++)
{
if(sum[i]<min)
{
min=sum[i];
m=i;
}
}
System.out.println("使用方法1得到的结果是:停在第"+m+"层,上下楼层数最小值"+min); }
public static void fangfa2(int N,int array[])//优化
{
int N1=0,N2=0,N3=0,i,j,k;
int min=0,m=2,sum=0;
array[1]=0;
for(i=2;i<=N;i++)
sum+=array[i];
for(i=2;i<=N;)
{
N1+=array[i-1];
N2=array[i];
N3=sum-N1-N2;
if(N1+N2<N3)
i++;
else
break;
}
for(j=2;j<=N;j++)
{
k=i>j?(i-j):(j-i);
min+=array[j]*k;
}
System.out.println("使用方法2得到的结果是:停在第"+i+"层,上下楼层数最小值"+min);
} }

三、运行结果截图

四、心得体会

  通过这次练习,我懂得了拿到一道题,首先要先想用最简单最直接的方法来实现,然后再想办法优化,提高算法效率。

软件工程课堂练习——N层电梯只停一层求乘客爬楼层数最少(基本方法+优化方法)的更多相关文章

  1. N层电梯只停一层情况下,求所有人爬楼层数最少

    一.题目: 石家庄铁道大学基础教学楼一共有四部电梯,每层都有人上下,电梯在每一层都停.信1201-1班张一东每层都停有点儿不耐烦.如果在上下课高峰时刻电梯从一层上行,但只允许停留在某一层.每个人选择自 ...

  2. 软件工程 --- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] [附加题]

    软件工程 --- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] [附加题] 首先,在分组之前,我和室友薛亚杰已经详细阅读了往届学长的博客,认为电梯调度 ...

  3. 软件工程 --- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试]

    软件工程  ---   Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] 说明结对编程的优点和缺点. 结对编程的优点如下: 在独立设计.实现代码的过程中不 ...

  4. Java实现目的选层电梯的调度

    一.前言 本次博客我将简单介绍一下前两次的电梯作业,并简单解析一下我的程序结构,进一步对我的第二次作业的算法核心和一些想法做一些分享,我的电梯设计算法并不是由调度器来决定电梯的捎带与否,而是由电梯自主 ...

  5. 在子页面使用layer弹出层时只显示遮罩层,不显示弹出框问题

    最近子页面使用layer弹出层时只显示遮罩层,不显示弹出框,这个问题搞了很久,最后才发现,在子页面上使用弹出框时,如果只使用layer.alert()或者layer.open()时,会默认在当前页面弹 ...

  6. 实现一个算法,寻找字符串中出现次数最少的、并且首次出现位置最前的字符 如"cbaacfdeaebb",符合要求的是"f",因为他只出现了一次(次数最少)。并且比其他只出现一次的字符(如"d")首次出现的位置最靠前。

    实现一个算法,寻找字符串中出现次数最少的.并且首次出现位置最前的字符如"cbaacfdeaebb",符合要求的是"f",因为他只出现了一次(次数最少).并且比其 ...

  7. Fantasy of a Summation n个数,k层重复遍历相加。求它的和%mod的值;推导公式+快速幂

    /** 题目:Fantasy of a Summation 链接:https://vjudge.net/contest/154246#problem/L 题意:n个数,k层重复遍历相加.求它的和%mo ...

  8. 在SpringMVC中,当Json序列化,反序列化失败的时候,会抛出HttpMessageNotReadableException异常, 当Bean validation失败的时候,会抛出MethodArgumentNotValidException异常,因此,只需要在ExceptionHandler类中添加处理对应异常的方法即可。

    在SpringMVC中,当Json序列化,反序列化失败的时候,会抛出HttpMessageNotReadableException异常, 当Bean validation失败的时候,会抛出Method ...

  9. PLC之六部十层电梯整体框架

    1.基本框架 此图基于西门子杯逻辑控制赛项中电梯题目的变量表以及功能设计 1.I/O输入是指变量表中的input数字量,包括电梯所有的内呼按钮.外呼按钮.电梯平层开关等 2.逻辑处理是指根据相对应的输 ...

随机推荐

  1. Linux之samba搭建

    参考资料: http://www.cnblogs.com/mchina/archive/2012/12/18/2816717.html

  2. C#处理Excel

    C#处理Excel C#处理Excel 前言 OleDb 具体操作 NPOI 具体操作 Excel C# NPOI OleDb 前言 最近需要对Excel进行加密解密操作,本身是一个简单的事情,通过 ...

  3. 1.Mariadb(mysql)基本操作

    1.:安装与初始化 1)安装 yum install -y mariadb\* 2)初始化 systemctl restart mariadb systemctl enable  mariadb my ...

  4. BochsDebug

    Bochs User Manual   Chapter 8. Tips and Techniques   8.12. Using Bochs internal debugger Note, if yo ...

  5. iOS中UIKit——UIFont得到iOS设备上的系统字体

    for (NSString *fontFamily  in [UIFont familyNames]) { NSLog(@"字体家族是:%@",fontFamily); for(N ...

  6. Lucene全文检索框架

    1.什么时Lucene? 是一个全文搜索框架,而不是应用产品,他只是一种工具让你能实现某些产品,并不像www.baidu.com拿来就能用 是apache组织的一个用java实现的全文搜索引擎的开源项 ...

  7. ThinkPHP之中的事务回滚

    小李子 获取thinkphp之中执行的SQL: 1.用调试模式的追踪trace功能: 2.代码: $user_type=D('user_type'); $datass=array('school_id ...

  8. PHP-PCRE正则表达式函数

    PCRE正则表达式函数 PCRE字符类 \\b        词边界 \\d        匹配任意数字 \\s        匹配任意空白,如TAB制表符或空格 \\t        匹配一个TAB ...

  9. CSS3常用功能的写法

    随着浏览器的升级,CSS3已经可以投入实际应用了. 但是,不同的浏览器有不同的CSS3实现,兼容性是一个大问题.上周的YDN介绍了CSS3 Please网站,该网站总结了一些常用功能的写法. 以下就是 ...

  10. 利用RecyclerView CardView实现新闻卡片样式

    引入的包: demo结构: 测试代码: News.java: package com.zzw.testcardview; import java.io.Serializable; public cla ...