# 第27期-拉力赛求最短时间

Python是一门需要不断实践练习的编程语言,本文档将AI大学堂学员交流群的Python每周练习进行汇总,希望各位小伙伴能够多进行实践练习,逐渐爱上这门神奇的编程语言,掌握它并在生活中能够使用它。

# 1 问题描述

在荒漠中举办拉力赛,为避免前车事故停车影响后车成绩,赛车分批出发。每隔5分钟出发10辆车,每辆赛车在通过起点和终点时都会独立计时。默认所有赛车完赛的正常耗时都在8小时以内。比赛从早上8点开始,下午4点全部结束,这时还没到终点的车辆不记到达成绩。现在得到了所有赛车的单独计时起止时间,请输出耗时最少的车辆编号(从1开始,顺序编号)和所用耗时。
输入说明:第一行是一个整数N,表示参加赛事的赛车数量。之后是N行,每行表示一辆赛车的单独计时时间,时间给出方式为小时+分钟的形式,如0830 1210表示8点30分通过起点,12点10分通过终点。
输出说明:耗时最少车辆的序号及所有耗时(用分钟表示),中间用空格分开,(如果所有赛车都没有完赛,输出-1)
输入样例: 6
0800 1210
0805 1320
0810 1215
0815 1300
0820 1310
0905 1430
输出样例: 3 405

# 2 解题思路

  • 输入车的数量,使用input函数
  • 输出最小时间及车辆,需要使用判断大小的方法
  • 需要判断输入的时间是否符合时间格式,不符合则重新输入
  • 可以考虑使用def创建函数

# 3 解题方法

def CarRace(m):
    min = 10000
    time = min1 = 0
    c = 1
    while c <= m:
        begin, end = map(int, input(f'请输入第{c}辆车出发及结束时间(中间用空格隔开):').split())
        if 0 <= begin // 100 <= 23 and 0 <= end // 100 <= 23 and 0 <= begin % 100 <= 59 and 0 <= end % 100 <= 59:
            if end % 100 - begin % 100 >= 0:
                time = end - begin
            else:
                time = end - begin - 40
            if time <= min and end // 100 < 16:
                min = time
                min1 = c
            c += 1
        else:
            print(f'您输入的第{c}辆车时间不正确,请重新输入')
    if min1 != 0:
        print(f'第{min1}辆车用时最短', end=',')
        print(f'其用时为{min},即{(min - min % 100) / 100}{min % 100}分')
    else:print(-1)


m = int(input('请输入车的数量:'))
CarRace(m)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

第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行: 提醒用户输入车的数量,并引用函数

代码运行结果为:
image.png

这里用到了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类型

# 4 视频解析

高清视频讲解,请查看AI大学堂Python基础实战100例 (opens new window)
关注『讯飞AI大学堂』公众号,发送 python100 即可领取Python基础实战100例源代码
AI大学堂公众号.png

更新于: 12/28/2021, 7:43:14 AM