2021年包河区青少年信息学科普日真题-乘坐电梯(lift)

题目描述
n 个人从一楼乘电梯回家,给出他们想要到达的楼层,请计算所 有人乘梯所用时间之和。时间的计算方法:在一楼进电梯,第 1 个人 用时 1 秒,第 2 个人用时 2 秒,……,第 i 个人用时 i 秒;电梯每上升一层,用时 1 秒;出电梯时,在同一楼层,第 1 个人用时 1 秒,第 2 个人用时 2 秒,……,第 i 个人用时 i 秒。

输入格式
两行。第一行一个正整数 n,表示乘梯人数;第二行 n 正整数,表示 每个人要到达的楼层。

输出格式
一行。一个整数,表示整个用时,单位是秒。

输入输出样例

输入样例13

13 18 13 

输出样例127 

说明
说明:一共 3 个人,两人到 13 层,一人到 18 层,进电梯用时 1+2+3=6 秒;电梯从 1 层到 13 层,用时 12 秒,从 13 层到 18 层,用时 5 秒, 合计 17 秒;出电梯 13 层 1+2=3 秒,18 层 1 秒,合计 4 秒。总用时 6+17+4=27 秒。

数据范围:1<=n<=13,2<=要到达的楼层<=32。


【解析】
此题考察基础模拟生活场景问题。
总用时分成三个部分:
进电梯+电梯运行+出电梯
1:进电梯 和 出电梯 其实属于一类问题,可以快速计算进电梯花费时间和出电梯花费时间。 你可以想象高斯是怎么求1+…+100的。
比如有5个人进入电梯,难道要1+2+3+4+5这样求时间吗?只需要(1+5)*5/2即可。
2:上面说的,可能有人还模糊。。实际上想表达的是如果你知道这层楼有多少人上或者有多少人下,就可以套公式去计算时间。那么这层楼有多少人下呢?实际上就是考察一个桶思想的运用了。

#include<bits/stdc++.h>
using namespace std;
int a[100],cnt; // cnt 表示用时 
int n,mx;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		a[x]++; //统计每层到达的人数
		mx=max(mx,x);//计算最大楼层号
	}
	cnt=(n+1)*n/2; // 在一楼时候,进入电梯的花费时间
	for(int i=2;i<=mx;i++){
		cnt++; // 每上一层cnt用时增加 1 
		if(a[i]){ // 这层是否有人下去 
			cnt+=(a[i]+1)*a[i]/2; // 还是高斯求和的运用 
		}
	}
	cout<<cnt;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ahstunwy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值