小Y的成绩
题目描述
小 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