软件工程课堂练习——N层电梯只停一层求乘客爬楼层数最少(基本方法+优化方法)
2015-04-18 20:57
274 查看
题目:
•石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停。信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)。
二、源代码
三、运行结果截图
四、心得体会
通过这次练习,我懂得了拿到一道题,首先要先想用最简单最直接的方法来实现,然后再想办法优化,提高算法效率。
•石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停。信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中1出现的个数
- MySQL中的alter table命令的基本使用方法及提速优化
- 课堂练习之电梯调度
- Mali GPU OpenGL ES 应用性能优化--基本方法
- 软件工程课堂练习找水王续
- Phoenix基本优化方法
- MySQL中的alter table命令的基本使用方法及提速优化
- 软件工程--课堂练习之四则运算之续编
- 软件工程课堂练习1
- MySQL中的alter table命令的基本使用方法及提速优化
- 课堂练习—电梯调度
- 课堂练习--电梯调度
- 结对开发----电梯调度(课堂练习)
- 软件工程课堂练习--找出“水王”
- iOS开发中UITableview控件的基本使用及性能优化方法
- java基本优化方法总结
- Mali GPU OpenGL ES 应用性能优化--基本方法
- FCKeditor基本配置优化修改使用方法