思路
设 $(x, y)$ 是车上的任意点(所有点),且当车到达 $(0, y)$ 时,奶牛以全速从原点出发不停顿可以到达 $(0, y^\prime)$。
- 若 $y \ge y^\prime$,则奶牛不会被撞,满足 $y \ge \frac{x}{v}u$,即 $y \ge \frac{u}{v}x$,即车内所有点在直线 $y = \frac{u}{v}x$ 上方。
- 若 $y \le y^\prime$,则奶牛不会被撞,满足 $y \le \frac{x}{v}u$,即 $y \le \frac{u}{v}x$,即车内所有点在直线 $y = \frac{u}{v}x$ 下方。
- 否则,车身被直线 $y = \frac{u}{v}x$ 穿过,奶牛如果不想被撞,就需要等待车先通过。无论奶牛在任何位置停顿、放慢速度或先行进再折返,都等价于先在原点停顿再全速通过,这些操作本质上是推迟了到达每个点的时间。假设在时刻 $t$ 奶牛的最大安全位置是 $y_t$,则在原点停顿 $t - \frac{y_t}{u}$ 秒后再全速出发,也能保证 $t$ 时刻到达 $y_t$。进一步地,若在原点等待的时间为 $t^\prime$,则立即全速从 $-t^\prime \times u$ 出发花费的时间不变。因此问题等价于全速从某个最大位置 $b < 0$ 出发,奶牛与车同时到达 $(0, y)$,即 $y \ge \frac{x}{v}u + b$,即车内所有点在直线 $y = \frac{u}{v}x + b$ 上方,边缘与直线相切,则 $b = y - \frac{u}{v}x$。
判断凸多边形是否在直线一侧,等价于判断凸多边形的所有顶点是否在直线一侧。
rl = lambda: map(int, input().split())
n, w, v, u = rl()
k, b = u / v, 0
cow_slow, cow_fast = True, True
for _ in range(n):
x, y = rl()
if y < k * x: cow_slow = False
elif y > k * x: cow_fast = False
b = min(b, y - k * x)
if cow_slow or cow_fast: print(w / u)
else: print((w - b) / u)