BCZM : 1.8
问题:
所有的员工均在1楼进电梯的时候,选择所要到达的楼层。然后计算出停靠的楼层i,当到达楼层i的时候,电梯停止。所有人走出电梯,步行到所在的楼层中。求所有人爬的楼层数目和的最小值。
解法一:
使用简单的方法,直接将楼层从1到n开始遍历
sum(person[i] * |i - j| ) 此表达式为一个双重循环,i与j均为1-n的循环。
j下标表示电梯停靠的楼层。
person数组表示,对应i层的下电梯的人数。此算法负责度为o(n*n)
对应的j是上述和为最小的一层即为所求。 上面的算法复杂度为o(n)
解法2:
下面考虑一个简单的算法,使其复杂度达到o(n)
考虑假如电梯停靠在某一楼层i处,假设在i处下楼的客人为N2,
在i以上楼层的客人数目为N3 ,在i一下楼层的客人数目为N1。
且将电梯在i层停止时,全部人员的路程之和记为T。
那么加入电梯在i-1层停的话,则原来i层之上的人需要多爬一层,即增加了N3
第i层的人需要多爬一层,则结果增加了N2, i层之下的人则少爬了一层,结果减去N1
所以第i-1层的结果为 T - N1 + N2 + N3 。即结果可以即为 T -(N1 - N2 - N3)
下面考虑在i+1层的结果,若电梯在i+1层停止的话,原来i层之上的客户都会少爬一层,
则结果减少N3 ,而i层之下的人员则都会多爬一层即增加了N1 ,第i层的人员都会多爬一层
即为增加了N2 。则结果为 T + N1 + N2 - N3
综上我们得出,
(1)若N1 > N2 + N3的时候, 我们在第i-1层 选择电梯停止最好。
(2)若N1 + N2 < N3的时候, 我们选择在第i+1层停止电梯最好。
下面我们可以先计算出来当i=1时候的T ,然后判断是否需要在i+1层停止,若是i+1层的花费
大于i层,则我们可以继续计算,否则退出。
解法三:
假设只有两个人,一个去9层,一个去2层,那么不管电梯停在2至9层中间的任何楼层,两个人的总花费都是7.就比如在数轴上点2和点9中间的任何点距离2和9的距离之后都是7。那么停在哪都无所谓了。接着我们扩展开来,假设有N个人,他们的目标楼层分别是2,3,3,4,5,5,5,7,7,8,9。按我们的想法,对于两端的(2,9)电梯只要停在他们之间都一样。同理对于(3,8)电梯只要停在他们中间都一样……。最终电梯只要停在中间那个数即可。也就是中位数。原来弄半天只需求出中位数即可啊。如果N是偶数个的话,停在中间那两个数任何一个都可以的。欢迎大家对我的解法拍砖。代码就不用了吧。
扩展1:
如果往上爬楼梯比较累,往下走较容易,假设往上走一层耗费k单位的能量,往下走一层只耗费1单位的能量。
扩展2:
M层电梯K个停靠层,可将最终问题分成两种情况:1,第M层为一个停靠层次;2,第M层不作为停靠层次。第一种情况通过动态规划解出,第二种情况运用第一种情况子问题数据可以解出。
解法:
用数组A[1]、A[2]、...A[M]分别记录需到电梯1~M层的乘客人数;Cost[i][j]记录i层到j层之间,只有第i和第j两层可以停靠,乘客(i和j层之间所有乘客)需要爬的电梯的最少层数;F[i][j]表示1~i层电梯之间,j个楼层停靠,且第i层必须是一个停靠层的的最优解;所求解为S[M][K],即电梯总共M个层,有K个停靠层,使所有乘客所有乘客需要爬的电梯层数最少,该选择哪些层停靠?最少是多少层?
状态方程为:
S[i][j] = min{F[i][j], min{F[i-t][j] + A[i]*t + A[i-1]*(t-1) + A[i-2]*(t-2)...A[i-t+1]*1} (1 <= t <= i-j) }
解释:最外层min{}中前一部分表示第i层作为停靠层的情况,后一部分表示第i层不作为停靠层的情况
BCZM : 1.8的更多相关文章
- BCZM: Chapter 2
2.1 二进制数中 1 的个数 实现一个函数,输入一个无符号整数,输出该数二进制中的1的个数.例如把9表示成二进制是1001,有2位是1,因此如果输入9,该函数输出2 分析与解法 解法1:利用十进制和 ...
- BCZM: Chapter 1
1.1 CPU 占用率 https://www.cnblogs.com/TenosDoIt/p/3242910.html 1.2 中国象棋将帅 https://blog.csdn.net/kabini ...
- BCZM : 2.1
1.问题描述 实现一个函数,输入一个无符号整数,输出该数二进制中的1的个数.例如把9表示成二进制是1001,有2位是1,因此如果输入9,该函数输出2 2.分析与解法 解法1:利用十进制和二进制相互转化 ...
- BCZM : 1.16
24点游戏 解法一:穷举法 解法二:分治法
- BCZM : 1.15
数独 解法一:广度优先搜索. 解法二:先填满中间矩阵,其他区域通过矩阵置换求出.
- BCZM : 1.9
有n个学生参加见面会,分别对m个研究组中的若干个感兴趣,为了满足所有学生的要求,每个学生都能参加自己感兴趣的见面会,如果每个见面会的时间为t,如何安排才能使得所有见面会的总时间最短? 分析: 先建立模 ...
- BCZM : 1.7
光影切割 在一个平面内有一个矩形区域,直线穿过矩形可以将其分割为不同的区域,且在这个平面中不存在三条直线相交一点的情况.求当有N条直线穿过矩形时,它被分割为多少个区域? 解法一: 平面倍划分 ...
- BCZM : 1.6
https://blog.csdn.net/kabini/article/details/2311946 题目大意: 水房能容纳饮料的总量是V,有一批饮料,每种饮料单个容量都是2的方幂,每种饮料信息如 ...
- BCZM : 1.5
https://blog.csdn.net/zs634134578/article/details/18046317 有很多服务器存储数据,假设一个机器仅存储一个标号为ID的记录,假设机器总量在10亿 ...
随机推荐
- 真实的『REM』手机屏幕适配
rem 作为一个低调的长度单位,由于手机端网页的兴起,在屏幕适配中得到重用.使用 rem 前端开发者可以很方便的在各种屏幕尺寸下,通过等比缩放的方式达到设计图要求的效果. rem 的官方定义『The ...
- js导出复杂表头(多级表头)的excel
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 结合Poi实现可读取Excel的文件选择对话框
第一步:ApachePoi的jar包导全,不全会出现异常. 第二步:写就完事了:此例为读取特定模板的excel,仅供参考,根据实际需求改写. package 自建包; import java.awt. ...
- 2018湘潭大学程序设计竞赛【E】
题目链接:https://www.nowcoder.com/acm/contest/105/E 题意:给你美食种类和查询次数,告诉你美味度和价格,给你固定钱数,问你最多能吃到多少美味度的食物.(X真是 ...
- springboot中引用配置文件中的参数
首先可以看到这是做微信登陆时候的配置,一般不会写死都是通过配置文件获取,所以,记载配置文件中 那么怎么引用呢: 可以看到直接注入的方式就可以引用了,所以看下面: 进行页面跳转,并且带有参数的, 使用m ...
- linux 7 添加永久路由方法
linux 7 添加永久路由 用route命令添加 仅仅是当前状态下生效,一旦重启就会失效. 所以要在/etc/sysconfig/network-scripts/这个路径下添加一个文件route-{ ...
- python 将字符串转换成字典dict
JSON到字典转化:>>>dictinfo = json.loads(json_str) 输出dict类型 字典到JSON转化:>>>jsoninfo = json ...
- 关于canvas绘制图像模糊问题
前段时间在做项目的裁剪并上传图像功能的时候,发现裁剪后展示的图像比较模糊,之后去百度上搜索了一下,看到有一个解决方案是设置canvas的宽高为css宽高的3倍,使用后感觉效果很好,当时就没管原理接着做 ...
- clipboard.js实现页面内容复制到剪贴板
clipboard.js实现复制内容到剪切板,它不依靠flash以及其他框架,应用起来比较简单 <input type="text" name="copy_txt& ...
- 开发中运行mysql脚本,发现提示mysql提示Column count doesn't match value count at row 1错误
开发中运行mysql脚本,发现提示mysql提示Column count doesn't match value count at row 1错误, 调试后发现是由于写的SQL语句里列的数目和后面的值 ...