北邮 python 问题 C: 排队前进

题目描述

有 n 个人排队向一个方向前进,他们前进的速度并不一定相同。 最开始即 t=0 时,每个人的位置并不相同。可以把他们放在数轴上,设他们前进的方向为正方向,对于从左往右第 i 个人,编号为 i,他的初始位置为xi ,初始速度为vi。编号为1的人(队尾,位于数轴最左侧)的位置总为坐标原点,即总有x1=0。(位置单位为米,速度单位为米每秒)。 虽然他们的前进速度不同,但是他们要保证前后顺序不能变。即i追赶上 i+1 的时候, i 将会紧跟 i+1 以 i+1 的当前速度前进.可以认为他们是紧挨着的,之间的距离可以忽略不计。 求编号为1的人前进 s 米需要多少秒.
输入
第一行两个整数n,s,其中(1<=n,s<=100,000),代表n个人排队前进,以及最后的一个人需要前进的距离为s米。 接下来n行,每行两个整数xi,vi,代表第i个人的位置xi,以及他的初始速度vi,保证(0=x1≤x2≤…≤xn≤100,000,1≤vi≤100,000)。
输出
输出一个小数,按照四舍五入的原则恰好保留小数点后两位(测试数据保证答案的小数点后第三位不是4或5)。

样例输入 Copy

3 4
0 3
1 2
2 1

样例输出 Copy

2.00


思路

第一种方法:按照最常见的思路方式,

  • 第一步,查找相邻两个队员之间相遇的最短时间,即全部遍历一遍
  • 第二步,在找到最短时间之后,进行每一位队员的坐标的更新
  • 第三步,根据被更新后的坐标,更新速度,即可。
  • 第四步,循环以上三个步骤即可(需要注意的是,在更新距离的时候,需要判断x1是否到达s,进行相应的处理)

第二种方法:

  • 第一步,从队列的最后往前遍历,直到某一位队员的位置恰好小于等于s
  • 第二步,计算与s坐标最近的队员X(m)的耗时 tq,再次计算X(m-1)的耗时 th(需要注意的是,前面的队员的速度不能够超过后面的队员的速度)
  • 然后th = max{ th , tq}
  • 重复2,3步骤,遍历完一遍即可。

代码解析

在这里插入图片描述

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页