问题描述
小l组织了一场拉力赛,有辆赛车,起初每辆车的排名依次为,,……,,即离起点最远的赛车排名最低,每辆赛车有一个初始位置和速度,在个单位时间后,每辆车会按照其速度匀速前进。小l想知道,在个单位时间后,有多少赛车的排名发生了上升。
保证一开始所有的赛车位置不相同。
如果在个单位时间后有两辆车的位置相同,则这两辆车的排名相同。一辆车的排名为在它前面的车辆的个数加。
测试样例
样例1:
输入:
n = 3 ,t = 1 ,p = [1, 2, 3] ,v = [3, 1, 3]
输出:1
样例2:
输入:
n = 5 ,t = 2 ,p = [0, 2, 4, 6, 8] ,v = [5, 2, 6, 4, 1]
输出:2
样例3:
输入:
n = 4 ,t = 3 ,p = [2, 5, 9, 14] ,v = [2, 4, 3, 1]
输出:1
题目解析:
题目要求计算在指定时间t后,有多少赛车的排名发生了上升。起始时每辆赛车的位置和速度已知,我们需要基于这些信息计算每辆赛车在时间后的最终位置,进而得出它们的最终排名,并与初始排名进行比较,以确定排名是否上升。
思路分析:
- 初始排名和位置:起始时每辆赛车排名为,,……,,即位置越靠后的赛车,初始排名越低。
- 位置变化:在时间后,每辆赛车的最终位置可以通过公式+×计算。
- 排序确定排名:根据赛车的最终位置进行排序,得到在时间后的最终排名。
- 统计排名上升情况 :比较每辆赛车的最终排名与其初始排名。如果最终排名(即排在前面的车辆数)比初始排名靠前,则表示该车排名上升。
解决方案:
- 计算最终位置:计算每辆车赛车在时间后的最终位置。
- 排序确定排名:根据赛车的最终位置排序以确定排名,若位置相同则排名相同。
- 比较排名变化:统计那些最终排名比初始排名靠前的赛车数量。
代码实现:
def solution(n: int, t: int, p: list, v: list) -> int:
# 计算每辆车在 t 时间后的最终位置
final_positions = [(p[i] + v[i] * t, i) for i in range(n)]
# 按照最终位置排序,记录最终排名
final_positions.sort()
# 统计排名上升的数量
rank_increase_count = 0
for final_rank, (_, initial_rank) in enumerate(final_positions):
if final_rank > initial_rank:
rank_increase_count += 1
return rank_increase_count
代码解释:
-
最终位置计算:
final_positions = [(p[i] + v[i] * t, i) for i in range(n)],这里的final_positions是一个列表,记录了每辆赛车在时间后的最终位置及其原始索引。 -
排序 :
final_positions.sort()根据最终位置排序赛车的列表,位置越靠前的赛车排名越高。 -
排名比较:
for final_rank, (_, initial_rank) in enumerate(final_positions)遍历排序后的列表,通过初始排名与最终排名比较,若最终排名更靠前则计数rank_increase_count。 -
返回结果:最后返回总的排名上升数量。
示例测试:
-
样例1:
print(solution(3, 1, [1, 2, 3], [3, 1, 3])) # 输出 1 -
样例2:
print(solution(5, 2, [0, 2, 4, 6, 8], [5, 2, 6, 4, 1])) # 输出 2 -
样例3:
print(solution(4, 3, [2, 5, 9, 14], [2, 4, 3, 1])) # 输出 1
时间复杂度:
- 位置计算:,需要遍历每辆车来计算最终位置。
- 排序:,需要对最终位置排序。
- 排名比较:,比较排名需要遍历一遍。
因此,整体时间复杂度为。
空间复杂度:
- 使用了额外的数组
final_positions存储位置和索引,因此空间复杂度为 。
总结
这道题的关键在于理解位置更新与排序的关系,通过比较最终排名和初始排名确定排名上升的车辆数量。