码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-04-19 14:25:42      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:

一、题目要求

石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停。信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;
}

  

四、程序截图

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

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

标签:

原文地址:http://www.cnblogs.com/huangxiaofei/p/4438954.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!