一.题目描述
某栋楼只有一部电梯,当你按下一个数时,电梯就会运行到那一层。已知电梯上一层需要6s,下降一层需要4s,在需要停留的那层停留5s。现在,电梯里有若干人,每个人都有去不同楼层的可能性,请问,电梯在完成最后一人的请求后,一共花了多少时间。
二.解题思路
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:电梯只停一层
结果2:电梯停留两层且都是向上
结果3:电梯停留两层是向下
结果4:电梯既有向上也有向下
结合代码分析:
其中代码核心为:
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]已经输入,可以比较判断楼层是上升还是下降。
本篇文章的细节还是挺多的。