题目描述
n 个人从一楼乘电梯回家,给出他们想要到达的楼层,请计算所 有人乘梯所用时间之和。时间的计算方法:在一楼进电梯,第 1 个人 用时 1 秒,第 2 个人用时 2 秒,……,第 i 个人用时 i 秒;电梯每上升一层,用时 1 秒;出电梯时,在同一楼层,第 1 个人用时 1 秒,第 2 个人用时 2 秒,……,第 i 个人用时 i 秒。
输入格式
两行。第一行一个正整数 n,表示乘梯人数;第二行 n 正整数,表示 每个人要到达的楼层。
输出格式
一行。一个整数,表示整个用时,单位是秒。
输入输出样例
输入样例1:
3
13 18 13
输出样例1:
27
说明
说明:一共 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;
}