原题:
http://172.16.0.132/junior/#contest/show/1368/0
题目描述:
细心的同事发现,小x最近喜欢乘电梯上上下下,究其原因,也许只有小x自己知道:在电梯里经常可以遇到他心中的女神。
电梯其实是个很暧昧的地方,只有在电梯里,小x才有勇气如此近距离接近女神。可是,他们的谈话也仅仅限于今天天气不错啊,或是你吃了吗之类的。往往在对方微笑点头后就再次陷入难堪的沉默之中。
于是,小x便在陪伴女神的同时,也关注着电梯中显示的楼层数字,并且他注意到电梯每向上运行一层需要6秒钟,向下运行一层需要4秒钟,每开门一次需要5秒(如果有人到达才开门),并且每下一个人需要加1秒。
特别指出,电梯最开始在0层,并且最后必须再回到0层才算一趟任务结束。假设在开始的时候已知电梯内的每个人要去的楼层,你能计算出完成本趟任务需要的总时间吗?
输入:
输入第一行为一个正整数 C,表示有 C 组测试数据。
接下来 C 行,每行包含一组数据,每组数据首先是一个正整数 N,表示本次乘坐电梯的人数,然后是 N 个正整数 Ai,分别表示大家要去的楼层。
输出:
请计算并输出完成一趟任务需要的时间,每组数据输出占一行。
样例输入:
2
4 2 4 3 2
3 10 10 10
样例输出:
59
108
数据范围限制:
其中,C<=100,N<=15,Ai<=100。
分析:
我们用f数组记录当前楼层要下电梯的人数,且用max记录要到达的最高层,接着我们枚举判断,当fi大于0是,ans+=fi+5;最后ans+=max*(4+6);
实现:
var
t,n,a,i,sum,ans,max:longint;
s:array[0..201]of longint;
begin
assign(input,'service.in');reset(input);
assign(output,'service.out');rewrite(output);
readln(t);
while t>0 do
begin
ans:=0; max:=0;
fillchar(s,sizeof(s),0);
read(n);
for i:=1 to n do
begin
read(a);
if a>max then max:=a;
inc(s[a]);
end;
sum:=0;
for i:=1 to 100 do
begin
if s[i]=0 then continue;
ans:=ans+s[i]+(i-sum)*6+5;
sum:=i;
end;
ans:=ans+max*4;
writeln(ans);
dec(t);
end;
close(input);close(output);
end.