一.题目描述

某栋楼只有一部电梯,当你按下一个数时,电梯就会运行到那一层。已知电梯上一层需要6s,下降一层需要4s,在需要停留的那层停留5s。现在,电梯里有若干人,每个人都有去不同楼层的可能性,请问,电梯在完成最后一人的请求后,一共花了多少时间。

java电梯时间 电梯里的时间_java电梯时间

二.解题思路

1.首先,我们需要了解电梯中的人按了多少次不同的楼层请求。
2.这些不同的请求是哪些楼层。
3.分别写出上楼和下楼所需时间函数。

int main(){
	int n,sum,i,a[30]={0};
	sum=0;
	cout<<"请输入不同的停留层数:"<<endl;
	scanf("%d",&n);
	cout<<"请输入不同的停留楼层号码:"<<endl;
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	for(i=1;i<=n;i++)
	{
		if(a[i]>a[i-1])
		{
			sum=sum+(a[i]-a[i-1])*6+5;
		}
		else
		{
			sum=sum+(a[i-1]-a[i])*4+5;
		}
	}
	cout<<"所需时间:"<<endl;
	printf("%d",sum);
	cout<<"\n"<<endl;
	return 0;
}

结果1:电梯只停一层

java电梯时间 电梯里的时间_i++_02


结果2:电梯停留两层且都是向上

java电梯时间 电梯里的时间_i++_03


结果3:电梯停留两层是向下

java电梯时间 电梯里的时间_c++_04

结果4:电梯既有向上也有向下

java电梯时间 电梯里的时间_数据结构_05

结合代码分析:
其中代码核心为:

for(i=1;i<=n;i++)
{
	if(a[i]>a[i-1])
	{
		sum=sum+(a[i]-a[i-1])*6+5;
	}
	else
	{
		sum=sum+(a[i-1]-a[i])*4+5;
	}
}

1.首先,电梯上升的次数和选择不同的楼层数量有关,这里用n表示电梯被选择了几种楼层。

2.判断楼层是上升还是下降,如果电梯一直上升,那么电梯所消耗的时间就是每一次电梯上升停留的时间之和,假设第一次上升1层,sum=上升一层的时间,第二次上升2层,那么第二次的时间sum=(第三层-第一层)*时间+5,这里使用for循环累加sum,且层数用a[i]和a[i-1]表示(a[i-1]表示前一次上升的是那一层,a[i]表示后一次上升到哪一层),表达式为:(a[i]-a[i]-1)*时间+5

3.如果电梯下降,那么电梯所消耗的时间就是每一次电梯下降停留的时间之和,假设电梯从三层降到一层,那么sum=(第三层-第一层)*时间+5,由于后一次的楼层低于前一次楼层,所以表达式为:(a[i-1]-a[i])*时间+5

三.疑问

可能很多人会问,为什么只能使用a[i]和a[i-1]来比较先后楼层呢?能不能使用a[i]和a[i+1]来表示先后楼层呢?
在这里,答案是不可以使用a[i]和a[i+1]来表示先后楼层
为什么呢?

我们的代码里,使用以下语句来输入楼层。

for(i=1;i<=n;i++)
{
	scanf("%d",&a[i]);
}

假设使用a[i]和a[i+1]进行判断会出现什么问题呢?
当i=1时,a[1]为我们第一个输入的元素,假设为1,那么a[1]=1,下面就会进行a[1]和a[2]判断楼层是上升还是下降,但是a[2]我们还没输入元素,默认初始化为0,这样就出现,第二个元素肯定小于第一个元素,也就是说,我们第二次无论输入哪个楼层,其结果都是0,类似的,当i=2时,a[2]为输入的值,但a[3]并没有输入,所以是默认0,改为for(i=0;i<n;i++)也没有效果,因为当i=0时,a[0]是输入的第一个元素,而a[1]没有输入。

那么只能使用a[i]和a[i-1]定义先后楼层了,这时i必须从1开始,因为数组a的下标最小从0开始。
当i=1时,a[1]为第一个输入的元素,和a[0]比较,a[0]没有输入,默认为0
当i=2时,a[2]为第一个输入的元素,和a[1]比较,a[1]已经输入,可以比较判断楼层是上升还是下降。

本篇文章的细节还是挺多的。