原文来自: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代码-少儿编程系统设计与实现-基于ssm的少儿编程系统-基于Web的少儿编程系统设计与实现-少儿编程网站-少儿编程网站代码-少儿编程平台...
编程训练-编程训练系统-编程训练系统源码-编程训练管理系统-编程训练管理系统java代码-编程训练系统设计与实现-基于springboot的编程训练系统-基于Web的编程训练系统设计与实现-编程训练网站-编程训练网站代码-编程...
少儿编程-少儿编程系统-少儿编程系统源码-少儿编程管理系统-少儿编程管理系统java代码-少儿编程系统设计与实现-基于ssm的少儿编程系统-基于Web的少儿编程系统设计与实现-少儿编程网站-少儿编程网站代码-少儿编程平台...
编程训练-编程训练系统-编程训练系统源码-编程训练管理系统-编程训练管理系统java代码-编程训练系统设计与实现-基于springboot的编程训练系统-基于Web的编程训练系统设计与实现-编程训练网站-编程训练网站代码-编程...
Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力...
Java 第二阶段建立编程思想 【异常】---- 代码 Java 第二阶段建立编程思想 【异常】---- 代码 Java 第二阶段建立编程思想 【异常】---- 代码 Java 第二阶段建立编程思想 【异常】---- 代码 Java 第二阶段建立编程...
Java 第二阶段建立编程思想 【面向对象编程(高级部分)】---- 代码 Java 第二阶段建立编程思想 【面向对象编程(高级部分)】---- 代码 Java 第二阶段建立编程思想 【面向对象编程(高级部分)】---- 代码 Java 第...
Java 第二阶段提升编程能力【坦克大战2.0】---- 代码 Java 第二阶段提升编程能力【坦克大战2.0】---- 代码 Java 第二阶段提升编程能力【坦克大战2.0】---- 代码 Java 第二阶段提升编程能力【坦克大战2.0】---- 代码 ...
Java 第一阶段建立编程思想 【零钱通(OOP)】---- 代码 Java 第一阶段建立编程思想 【零钱通(OOP)】---- 代码 Java 第一阶段建立编程思想 【零钱通(OOP)】---- 代码 Java 第一阶段建立编程思想 【零钱通(OOP)...
"Java编程百例-java入门"这个资源是专为初学者设计的,旨在帮助他们掌握Java的基础知识,包括核心语法、Web开发技术以及用户界面设计。下面,我们将深入探讨这些关键知识点。 1. **Java基础语法**: - **变量与...
Java函数式编程是一种编程范式,它强调使用函数作为程序的基本构建块,将计算视为函数的组合,并且尽可能避免改变状态和可变数据。在Java 8及更高版本中,函数式编程得到了官方的大力支持,引入了Lambda表达式、...
电梯模拟是一个经典的计算机科学问题,尤其在软件工程和算法设计中具有重要的教学价值。这个"Lift-Question.zip"文件包含了对Java实现电梯模拟的探讨,让我们深入了解一下相关的知识点。 首先,电梯模拟涉及到的...
google-java-style_google-java编程规范 别人翻译的我给整理成pdf文档
- `深入理解java虚拟机(带目录) 周志明.pdf` 是Java程序员的必读之作,详细阐述了JVM的工作原理,包括类加载机制、内存模型、垃圾回收、性能优化等方面,对于提升程序运行效率至关重要。 3. **反射机制**: - ...
标题中的“聊天室------java编写----多人聊天”表明这是一个基于Java编程语言开发的多用户聊天应用程序。这个项目可能是一个简单的实现,旨在帮助学习者理解如何构建一个基础的网络通信系统,特别是涉及到多人实时...
计算机专业基础理论电子书合集06----编程语言:java (1) 包括经典的:java核心技术,java web开发,head frist
Scratch少儿编程项目音效音乐素材-电梯铃声.zip
Yr9ToaEI0K8ARmH6Java编程方法论-JDK篇之NIO分享视频在分享相关博文: : B站: : 油管: : ZZnCI8xaTRo list PL95Ey4rht799NVLgQiSV9skTqY6VuspIkJava编程方法论-Netty篇在分享B站: : 油管: : AHNW9YCF9aI list PL...