C++算法基础(3)--电梯时间算法

今天在逛Blink时,有人私信问了一道题,我觉得这道题很值得学习,于是就研究并记录了下来。

一.题目描述

某栋楼只有一部电梯,当你按下一个数时,电梯就会运行到那一层。已知电梯上一层需要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]已经输入,可以比较判断楼层是上升还是下降。

本篇文章的细节还是挺多的。
在这里插入图片描述 在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值