#P1771. Elevator Stopping Plan

Elevator Stopping Plan

描述

ZSoft公司位于高科大厦内。大厦里的员工工作都非常努力,但大厦里的电梯总是让他们苦不堪言。为什么呢?因为高科大厦只有一部电梯,却有数百家公司入驻。每天早上,人们都要浪费大量时间等电梯。

聪明的ZSoft员工哈尔想改变这一现状,他想找到让电梯更高效运行的方法,但这并非易事。

高科大厦共有31层。电梯每上升一层需要4秒,即:若电梯从1层直达31层且中途不停,耗时为(311)×4=120(31-1) \times 4 = 120秒。电梯每次停靠需停留10秒(31层无需计算停靠时间)。例如,若电梯在每一层都停靠,总耗时为30×4+29×10=41030 \times 4 + 29 \times 10 = 410秒。另一方面,员工步行每层需要20秒,从1层步行到31层需30×20=60030 \times 20 = 600秒,显然这不是好选择。因此,有些人会选择乘坐电梯到离办公室最近的楼层。

经过长时间思考,哈尔终于想到了改进方案。他告诉电梯管理员:首先,管理员统计所有人要到达的楼层,然后设计一个停靠方案,使得最后一个人到达目标楼层的时间最短。例如,若需要停靠的楼层为4、5、10层,最优方案是只停靠4层和10层。电梯到达4层耗时3×4=123 \times 4 = 12秒,停留10秒后,到达10层耗时3×4+10+6×4=463 \times 4 + 10 + 6 \times 4 = 46秒。去4层的人12秒到达,去5层的人需12+20=3212 + 20 = 32秒(步行1层),去10层的人46秒到达。因此,最后一人到达的时间为46秒,这是较优的方案。

现在,你需要编写程序帮助电梯管理员设计停靠方案,使得最后一人到达目标楼层的时间最短。

输入

输入包含多个测试用例,每个用例占一行,格式为:
n f1 f2 ... fn
其中n表示需要停靠的楼层数,n=0时表示输入结束。f1 f2 ... fn为需要停靠的楼层(n≤30,2≤f1<f2<…<fn≤31),每个数字用空格分隔。

输出

对每个测试用例,第一行输出最后一人到达的最短时间,第二行输出停靠方案。请注意,第二行开头需包含停靠楼层的总数,随后是楼层列表。可能存在多个最优解,输出任意一个即可。不允许出现多余空格。

输入数据 1

3 4 5 10  
1 2  
0

输出数据 1

46  
2 4 10  
4  
1 2

来源
Asia Guangzhou 2003