Python 应用之拉力赛求最短时间
1.问题描述
在荒漠中举办拉力赛,为避免前车事故停车影响后车成绩,赛车分批出发。每隔 5 分钟出发 10 辆车,每辆赛车在通过起点和终点时都会独立计时。默认所有赛车完赛的正常耗时都在 8 小时以内。比赛从早上 8 点开始,下午 4 点全部结束,这时还没到终点的车辆不记到达成绩。现在得到了所有赛车的单独计时起止时间,请输出耗时最少的车辆编号(从 1 开始,顺序编号)和所用耗时。输入说明:第一行是一个整数 N,表示参加赛事的赛车数量。之后是 N 行,每行表示一辆赛车的单独计时时间,时间给出方式为小时+分钟的形式,如 0830 1210 表示 8 点 30 分通过起点,12 点 10 分通过终点。输出说明:耗时最少车辆的序号及所有耗时(用分钟表示),中间用空格分开,(如果所有赛车都没有完赛,输出-1)
输入样例: 60800 12100805 13200810 12150815 13000820 13100905 1430 输出样例: 3 405
2.解题思路
输入车的数量,使用 input 函数
输出最小时间及车辆,需要使用判断大小的方法
需要判断输入的时间是否符合时间格式,不符合则重新输入
可以考虑使用 def 创建函数
3.解题方法
第 1 行: def 创建车辆竞赛函数
第 2 行: 给最小值一个较大的值,保证下一个数一定可以比这个数小,如此便可以将其替换为第一个算出来的数
第 3-4 行: 定义 time 时间差以及 min1 为 0,定义循环次数及车辆为 i
第 5 行: 使用 while 循环判断是第几辆车正在计算
第 6 行: 定义 begin 和 end 变量,并输入两个整数类型的值返回到 begin 和 end,输入值中间用空格隔开
第 7 行: 判断输入的值是否符合时间的格式
第 8-11 行: 若符合格式,对结束时间分钟小于开始时间分钟的情况需要进行时间转换(因为时间分钟是 60 分钟一个小时,不能直接减)
第 12-14 行: 若时间差 time 小于最小时间值 min,则将 time 的值赋值给 min,且定义 min1,赋值其最小时间的车辆
第 15 行: 若时间输入格式正确,则输入下一辆车的时间
第 16-17 行: 对输入格式不正确的车辆,保证 i 值没有变化并打印提示用户重新输入
第 18-20 行: 当 min1 发生变化时,表示有车辆的时间是正确的并且输出最小时间
第 21 行: 当 min1 没发生变化时,表示没有车辆在指定时间之前到达,输出-1
第 24-25 行: 提醒用户输入车的数量,并引用函数
代码运行结果为:
这里用到了 map(int,input().split())函数,简单讲解下这个函数:
map()函数
map() 会根据提供的函数对指定序列做映射。第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
语法:
map(function, iterable, ...)
参数说明:function -- 函数 iterable -- 一个或多个序列
例如:map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])输出:[3, 7, 11, 15, 19]
所以这里面的 map(int,str())是将 str 里面的内容转换为 int 类型
str.split()函数
split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串
语法:str.split(str="", num=string.count(str)).
参数说明:str -- 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。num -- 分割次数。默认为 -1, 即分隔所有。
所以这里面的 input().split()就是输入多个值,并用空格隔开,不过输入的值是字符串,所以需要用 map 函数转换为 int 类型
版权声明: 本文为 InfoQ 作者【向阳逐梦】的原创文章。
原文链接:【http://xie.infoq.cn/article/23331baba9ddcab08fca92b9b】。文章转载请联系作者。
评论