4月17号周五课堂练习:电梯最优问题

一、题目要求

石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停。信1201-1班的张一东觉得在每层都停觉得不耐烦。

由于楼层不太高,在上下课高峰期时时,电梯从一层上行,但只允许停在某一楼层。在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。

问电梯停在那一楼层,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少。

二、设计思想
设第一个人按l1楼层,第二个人按l2楼层……第n个人按ln楼层。设最优的层数为x
设计思路一:
求绝对值得最小值
min=|l1-x|+|l2-x|+l3_x|……|ln-x|
设计思路二:
求方差的最小值
min=(l1-x)^2+(l2-x)^2+(l3-x)^2+……(ln-x)^2
min最小时,x取得最优楼层。min默认为0。
即x=(-b(+/-)sqrt(b^2-4ac))/2a
将求得的结果进行取整和取舍,x大于最小楼层,小于最大楼层
设计思路三:
假设电梯停在第i层,显然我们可以计算出所有乘客总共要爬的层数Y。如果有N1个乘客目的楼层在i层以下,有N2个乘客在i层,还有N3个乘客在第i层以上。这个时候,如果电梯改停在第i-1层,所有目的地在i层以上的乘客都要多爬一层,总共需要N2+N3层,而所有目的地在第i-1层以下的乘客都可以少爬一层,总共少爬N1层。所以乘客总共需要爬Y-(N1-N2-N3)
反之,如果电梯停在i+1层,那么乘客总共需要爬Y+(N1+N2-N3)层。
由此可知:
当N1>N2+N3时,电梯停在i-1层好,乘客少走N1-N2-N3层
当N1+N2<N3时,电梯停在i+1层好
其他情况停在i层好
我们可以从第一层开始考虑

三、代码实现

#include <iostream>
using namespace std;
//======复杂度为O(n平方)======
/*
int Person[] = {1, 1, 1, 9, 1};
int TargetFloor = -1;
int MinFloor;
int N = 5;
int nFloor;
*/
/*
void Min()
{
for(int i = 1; i < N; ++i)
{
nFloor = 0;
for(int j = 1; j < i; ++j)
{
nFloor += Person[j - 1] * (i - j);
}
for(int k = i + 1; k <= N; ++k)
{
nFloor += Person[k - 1] * ( k - i);
}
if(TargetFloor == -1 || MinFloor > nFloor)
{
MinFloor = nFloor;
TargetFloor = i;
}
}
cout << "It should stop at :" << endl;
cout << TargetFloor << " Floor" << endl;
cout << "The Min Floor is: " << endl;
cout << MinFloor << endl;
}
*/

//=========复杂度为O(n)=========
int Person[] = { 1, 6, 3, 9, 5 };
int TargetFloor = 1;
int MinFloor = 0;
int N1;//第i层以下的总乘客数
int N2;//第i层的乘客数
int N3;//第i层以上的总乘客数
int i;
int N = 5;
void Min1()
{
	for (N1 = 0, N2 = Person[N - 1], N3 = 0, i = N - 1; 1 <= i; --i)
	{
		N1 += Person[i - 1];
		MinFloor += Person[i - 1] * (N - i);
	}
	for (int j = N - 1; 1 <= j; --j)
	{
		if (N1 > N2 + N3)
		{
			TargetFloor = j;
			MinFloor -= (N1 - N2 - N3);
			N3 += N2;
			N2 = Person[j - 1];
			N1 -= Person[j - 1];
		}
		else
			break;
	}
	cout << "应该停在: " << endl;
	cout << TargetFloor << " Floor" << endl;
	cout << "最小楼层数: " << endl;
	cout << MinFloor << endl;
}

int main()
{
	Min1();
	system("pause");
	return 0;
}

  

四、程序截图


五、实验总结
一个问题通常有很多种解决办法,我们却一开始选择最难,最复杂的一种。其实我们可以从最简单的方法入手,然后逐渐的将方法算法进行优化,最后就可以的到最优,最简的方法。

时间: 2024-08-27 18:29:09

4月17号周五课堂练习:电梯最优问题的相关文章

4月17号周五课堂练习:用户场景分析

一.persona(典型用户) 姓名                   笨蛋先生 性别.年龄          男,22岁 职业                  学生 收入(月花销)    700元/月 知识层次和能力    大学本科,计算机相关的专业 生活/工作情况      学习,运动,游戏 动机,目的,困难 通过玩不同的游戏,来了解游戏的开发动向和目前大众的娱乐 方向.困难:游戏更新速度太快,有点跟不上发展的节奏. 用户偏好 打球,跑步,轮滑 用户比例             ????

4月24号周五课堂练习:找水王续

一.题目要求 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半.如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗? 随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗? 二.设计思路 三.程序代码 #include<

3月27号周五课堂练习:结对开发----返回一个整数数组中最大子数组的和三

一.题目要求 1.1输入一个整形数组,数组里有正数也有负数. 1.2数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 1.3如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 1.4同时返回最大子数组的位置. 1.5求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思想 三.源代码 #include<iostream> #include<time.h> #include<conio

3月13号周五课堂练习:对四则运算二进行测试(选择一个条件)

测试条件:随机数的取值范围 1.当负数和0时出现提示重新输入 2.当题目数量大于随机数的取值范围如1时,产生相同的四则运算关系式 3.当输入字母和其他特殊字符时,程序崩溃 4.当输入取值过大时,提示重新输入(最大的值99999999999999,14个9) 通过本次测试发现自己的程序不够健壮,很多bug,后期要好好的把发现的程序bug解决掉.

3月6号周五课堂练习:随机产生30个思则运算的题目

#include <stdlib.h> #include <iostream> #include <time.h> using namespace std; //随机产生30个四则运算题目的tesk void tesk() { int x, y, z; for (int i = 0; i < 30; i++){ x = rand() % 100; y = rand() % 100; z = rand() % 4; switch (z) { case(0) : co

8月17号=》421页-430页

15.3 DOM的事件模型 15.3.1 绑定事件处理器 DOM也提供了一种事件绑定机制,这种机制和Internet Explorer的attachEvent()方法类似,但是有自己独特的语法.DOM所提供的 事件绑定方法是addEventListener(),该方法的语法格式如下. objectTarget.addEventListener("eventType",handler,captureFlag):该方法为objectTarget绑定事件处理器handler,其 第一个参数是

6月17号=》161页-165页

6.5.3 浏览器专属的属性 常见的浏览器前缀 前缀 组织 示例 说明 -ms- Microsoft -ms-interpolation-mode Internet Explorer浏览器专属的CSS属性需添加-ms-前缀 -moz- Moazilla -moz-read-only 所有基于Gecko引擎的浏览器(如Firefox)专属的CSS属性需添加 -moz-前缀 -o- Opera -o-text-overflow Opera浏览器专属的CSS属性需添加-0-前缀 -webkit- We

7月17号=》221页-225页

10.1.1 通过float属性实现多栏布局 通过使用float属性,可以非常方便地基于<div>元素来设置导航菜单.多栏布局 等效果.代码示范: //为div元素设置左浮动,如果多个div元素的总宽度未超过父元素的宽度 则在一行显示多个div div{ float:left; } 10.1.2 使用clear属性实现换行 clear属性用于设置HTML组件的左.右是否允许出现“浮动”组件,如果该 属性指定为left,则左边不允许出现“浮动”组件:如果指定为right,则右边 不允许出现“浮动

3月10号周二课堂练习:四则运算二

一.题目新的要求 1.题目避免重复: 2.可定制(数量/打印方式): 3.可以控制下列参数: 是否有乘除法.是否有括号. 数值范围.加减有无负数.除法有无余数.否支持分数 (真分数, 假分数, …).是否支持小数 (精确到多少位).打印中每行的间隔可调整: 二.设计思想(将自己上次上课时的设计思想进行稍微的修改) 1.判断两次随机数是否相同    使用函数srand()保证两个随机数不同 2.多加入一个变量,来控制题目数量 3.在每一个switch选择的语句,进行选择判断  3.1选择是否有乘除