zl程序教程

您现在的位置是:首页 >  后端

当前栏目

小学生蓝桥杯Python闯关 | 小Y的成绩

Python 蓝桥 成绩 小学生 闯关
2023-09-14 09:09:06 时间

学习Python从娃娃抓起!记录下蓝桥杯Python学习和备考过程中的题目,记录每一个瞬间。

附上汇总贴:小学生蓝桥杯Python闯关 | 汇总_COCOgsta的博客-CSDN博客


【题目描述】

小 Y 特别喜欢环湖赛跑,因为这样空气非常好,跑起来特别有动力。正值一年一度的环湖跑王者争霸赛开始了,小 Y 就立刻报名了。比赛主办方在周长为 8000 米的湖周围一圈设置了 n 个夺分点,逆时针编号为 1~n,每个夺分点的积分不一定相同,每个积分点的具体位置和积分数量由主办方在比赛开始前公布。比赛规定:参赛者可以选择从赛道的任意一点出发,只能逆时针跑,需要在 5 分钟内尽可能多拿分,只要到达积分点即可得到该积分点的积分,不同人到达同一积分点均能得到积分,互不影响。经过小 Y 自己赛前的反复测试发现,平均下来,自己比赛时的速度为 3.5 米每秒。

请问小 Y 以这个速度最多能拿多少分呢?最多能拿的分和最少能拿的分差多少呢?

【输入描述】

2n + 1 行,

第一行,一个整数 n,表示积分点的个数;

接下来 n 行,每行一个数,表示积分点的距离,这个距离是相对于 1 号积分点的距离。距离按照积分点的编号从 1 到 n 进行输入,由小到大,保证一圈的距离足够大,无法跑完一整圈;

再接下来的 n 行,每行一个数,表示每个积分点的积分,也是按照积分点的编号顺序进行输入,保证积分总和不超过 1000000000。

【输出描述】

两行,

第一行为小 Y 能得到的最多积分;

第二行为小 Y 能拿到最多积分与最少积分的差值。

【样例输入】

5

0

123

555

6111

7521

23

54

21

76

32

【样例输出】

130

109

【代码详解】

n = int(input())

ls = [int(input()) for i in range(n)]
ls.append(8000)

total = int(3.5 * 300)
point = 0
ls_sum = []
ls2 = []

# 计算两点之间的距离
for i in range(1, len(ls)):
    dis = ls[i] - ls[i - 1]
    ls2.append(dis)
ls2 = ls2 * 2  # 重复一遍列表,以免从任意位置开始后距离不足

# 生成距离对应的积分
ls_p = [int(input()) for i in range(n)]
ls_p1 = ls_p.pop(0)
ls_p.append(ls_p1)
ls_p = ls_p * 2  # 对应上面距离,将积分列表也重复一遍

dist = 0
for i in range(len(ls2) // 2):
    if i == 0:
        point = point + ls_p[-1]
    else:
        point = point + ls_p[i - 1]
    for j in range(i, len(ls2)):
        dist = dist + ls2[j]
        if total < dist:
            dist = 0
            break
        else:
            point = point + ls_p[j]
    ls_sum.append(point)
    point = 0

# 按照从小到大顺序排列
ls_sum.sort()

print(max(ls_sum))
print(ls_sum[-1] - ls_sum[0])
复制代码

【运行结果】

5
0
123
555
6111
7521
23
54
21
76
32
130
109